/ Hex Artifact Content
Login

Artifact ed5cff11793b6a4146582aabb29ed8613a6cf89e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53 68 61  .  u8 hasHeldSha
7920: 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f  redLock;       /
7930: 2a 20 54 72 75 65 20 69 66 20 61 20 73 68 61 72  * True if a shar
7940: 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76 65 72  ed lock has ever
7950: 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a 20 20   been held */.  
7960: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7980: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7990: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
79a0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
79b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
79c0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
79f0: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7a10: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a30: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69  e */.  Pgno dbHi
7a40: 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
7a50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73     /* Value pass
7a60: 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45  ed to FCNTL_SIZE
7a70: 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20  _HINT call */.  
7a80: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
7ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
7ac0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
7af0: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
7b00: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
7b10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
7b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7b30: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
7b40: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
7b50: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
7b60: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
7b90: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
7ba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7bb0: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
7bc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
7bd0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
7be0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
7bf0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
7c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
7c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
7c20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c30: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
7c40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
7c50: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
7c60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7c70: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
7c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
7c90: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
7ca0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
7cb0: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
7cc0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
7cd0: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
7ce0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7cf0: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
7d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7d10: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7d20: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
7d30: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
7d40: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
7d50: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
7d60: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
7d70: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
7d80: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
7d90: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
7da0: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20  p processes */. 
7db0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
7dc0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
7dd0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
7de0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
7df0: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
7e20: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
7e30: 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61  ] */.  u32 iData
7e40: 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Version;        
7e50: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
7e60: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
7e70: 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20  content changes 
7e80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
7e90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
7ea0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
7eb0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
7ec0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
7ed0: 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20   int nMmapOut;  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ef0: 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70  Number of mmap p
7f00: 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  ages currently o
7f10: 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20  utstanding */.  
7f20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
7f30: 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44  Mmap;       /* D
7f40: 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d  esired maximum m
7f50: 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67  map size */.  Pg
7f60: 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69  Hdr *pMmapFreeli
7f70: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st;       /* Lis
7f80: 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70  t of free mmap p
7f90: 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69  age headers (pDi
7fa0: 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  rty) */.  /*.  *
7fb0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7fc0: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7fd0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
8030: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8050: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
8060: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
8070: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
8080: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80a0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
80b0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
80c0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
80d0: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
80f0: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
8100: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
8110: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8130: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
8140: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
8150: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
8160: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
8170: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8180: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
8190: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
81a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
81b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
81c0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
81d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
81e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
81f0: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
8200: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
8210: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
8220: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
8230: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
8240: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8250: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8260: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
8270: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
8280: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8290: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
82a0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
82b0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
82c0: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
82d0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
82e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
82f0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8300: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8310: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8320: 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  ndler */.  int a
8330: 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20  Stat[3];        
8340: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
8350: 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  cache hits, miss
8360: 65 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f  es and writes */
8370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8380: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
83b0: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
83c0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
83d0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
83e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
83f0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
8400: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
8410: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
8420: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
8430: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
8440: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
8450: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
8460: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
8470: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8480: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
8490: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
84a0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
84b0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
84c0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
84d0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
84e0: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
84f0: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
8500: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
8510: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
8520: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
8530: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
8540: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
8550: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
8560: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
8570: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
8580: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
8590: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
85a0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
85b0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
85c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
85d0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
85e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
85f0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
8600: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
8610: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
8620: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
8630: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
8640: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
8650: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
8660: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8670: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
8680: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
8690: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  if.};../*.** Ind
86a0: 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74  exes for use wit
86b0: 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e  h Pager.aStat[].
86c0: 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74   The Pager.aStat
86d0: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
86e0: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20  s.** the values 
86f0: 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73  accessed by pass
8700: 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41  ing SQLITE_DBSTA
8710: 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43  TUS_CACHE_HIT, C
8720: 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72  ACHE_MISS .** or
8730: 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20   CACHE_WRITE to 
8740: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8750: 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  s()..*/.#define 
8760: 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20  PAGER_STAT_HIT  
8770: 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   0.#define PAGER
8780: 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64  _STAT_MISS  1.#d
8790: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
87a0: 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20  _WRITE 2../*.** 
87b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
87c0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68  obal variables h
87d0: 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65  old counters use
87e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
87f0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
8800: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
8810: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
8820: 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e  .** a non-testin
8830: 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20  g build.  These 
8840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
8850: 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a  t thread-safe..*
8860: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8870: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
8880: 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
8890: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
88a0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
88b0: 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42  ges read from DB
88c0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
88d0: 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
88e0: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  unt = 0;   /* Nu
88f0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8900: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42  es written to DB
8910: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
8920: 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
8930: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8940: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
8950: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
8960: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
8970: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
8980: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
8990: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
89a0: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
89b0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
89c0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
89d0: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
89e0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
89f0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
8a00: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
8a10: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
8a20: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
8a30: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
8a40: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
8a50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8a60: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
8a70: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
8a80: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8a90: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
8aa0: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
8ab0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
8ac0: 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  ng.** written, s
8ad0: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
8ae0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
8af0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
8b00: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
8b10: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
8b20: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
8b30: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
8b40: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
8b50: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
8b60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
8b70: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
8b80: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
8b90: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
8ba0: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
8bb0: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
8bc0: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
8bd0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
8be0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
8bf0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
8c00: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8c10: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
8c20: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8c30: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
8c40: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
8c50: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
8c60: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
8c70: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
8c80: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
8c90: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
8ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
8cb0: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
8cc0: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
8cd0: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
8ce0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
8cf0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
8d00: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
8d10: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
8d20: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
8d30: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
8d40: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
8d50: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
8d60: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
8d70: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
8d80: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
8d90: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
8da0: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
8db0: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
8dc0: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
8dd0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
8de0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
8df0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
8e00: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
8e10: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
8e20: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
8e30: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
8e40: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
8e50: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
8e60: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
8e70: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
8e80: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
8e90: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
8ea0: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
8eb0: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
8ec0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
8ed0: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
8ee0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
8ef0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
8f00: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
8f10: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
8f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
8f30: 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70  of the of each p
8f40: 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68  age record in th
8f50: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76  e journal is giv
8f60: 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c  en by.** the fol
8f70: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f  lowing macro..*/
8f80: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8f90: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
8fa0: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
8fb0: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
8fc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
8fd0: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
8fe0: 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20   pager. This is 
8ff0: 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  usually the same
9000: 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73   .** size as a s
9010: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
9020: 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53  r. See also setS
9030: 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a  ectorSize()..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
9060: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
9070: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
9080: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
9090: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
90a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
90b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
90c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
90d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
90e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
90f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
9100: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
9110: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
9120: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
9130: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
9140: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
9150: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
9160: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
9170: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
9180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9190: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
91a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
91b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
91c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
91d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
91e0: 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73  acro USEFETCH is
91f0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9200: 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74  allowed to use t
9210: 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55  he xFetch and xU
9220: 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66  nfetch.** interf
9230: 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  aces to access t
9240: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
9250: 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  g memory-mapped 
9260: 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  I/O..*/.#if SQLI
9270: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
9280: 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46  >0.# define USEF
9290: 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55  ETCH(x) ((x)->bU
92a0: 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23  seFetch).#else.#
92b0: 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48   define USEFETCH
92c0: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
92d0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
92e0: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
92f0: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
9300: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
9310: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
9320: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  83647../*.** The
9330: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
9340: 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c  s macro is a fil
9350: 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79  e descriptor (ty
9360: 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  pe sqlite3_file*
9370: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  )..** Return 0 i
9380: 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  f it is not open
9390: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62  , or non-zero (b
93a0: 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20  ut not 1) if it 
93b0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  is..**.** This i
93c0: 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73  s so that expres
93d0: 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69  sions can be wri
93e0: 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
93f0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
9400: 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a  er->jfd) ){ ....
9410: 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  **.** instead of
9420: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61  .**.**   if( pPa
9430: 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
9440: 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65  ds ){ ....*/.#de
9450: 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29  fine isOpen(pFd)
9460: 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64   ((pFd)->pMethod
9470: 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s!=0)../*.** Ret
9480: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
9490: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
94a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
94b0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
94c0: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
94d0: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
94e0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
94f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9500: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
9510: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
9520: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
9530: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
9540: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9550: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9560: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9570: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9580: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9590: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
95a0: 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66  v,w,x,y) 0.# def
95b0: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
95c0: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
95d0: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
95e0: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
95f0: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
9600: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
9610: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9620: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
9630: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
9640: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
9650: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
9660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
9670: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
9680: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9690: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
96a0: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
96b0: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
96c0: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
96d0: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
96e0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
96f0: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9700: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9710: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9720: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
9730: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
9740: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
9750: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9760: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
9770: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9780: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9790: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
97a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97b0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
97c0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97e0: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
97f0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9800: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9810: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9820: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9830: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
9840: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9850: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9860: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9870: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9880: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9890: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
98a0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
98b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
98c0: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
98d0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
98e0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
98f0: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9900: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9910: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9920: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
9930: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
9940: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9950: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9960: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9970: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9980: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9990: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
99a0: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
99b0: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
99c0: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
99d0: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
99e0: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
99f0: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9a00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9a10: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9a20: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
9a30: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9a40: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9a50: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9a60: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9a70: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a80: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9a90: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9aa0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9ab0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9ac0: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9ad0: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9ae0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9af0: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9b00: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9b10: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9b20: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
9b30: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
9b40: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9b50: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9b60: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9b70: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9b80: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9b90: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9ba0: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9bb0: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9bc0: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9bd0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9be0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9bf0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9c00: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9c10: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9c20: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
9c30: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
9c40: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9c50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9c60: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9c70: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9c80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9c90: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9ca0: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9cc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9cd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9ce0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
9cf0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9d00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9d10: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
9d20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
9d30: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
9d40: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
9d50: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
9d60: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
9d70: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
9d80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9d90: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9da0: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9db0: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9dc0: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9dd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9de0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9df0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9e00: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
9e10: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
9e20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
9e30: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
9e40: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
9e50: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
9e60: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
9e70: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
9e80: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9e90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ea0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9eb0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9ed0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9ee0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
9ef0: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
9f00: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
9f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9f20: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
9f30: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9f50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9f70: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9f80: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9f90: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9fa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9fc0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9fd0: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
9fe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ff0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a000: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a010: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a030: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
a040: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
a050: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a060: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a070: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a080: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a090: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a0a0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
a0b0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a0c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0d0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a0e0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a100: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a110: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a120: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
a140: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
a150: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a160: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a170: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
a180: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a190: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a1a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a1c0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a1d0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a1e0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
a200: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
a210: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
a220: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
a230: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
a240: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
a250: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
a260: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
a270: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
a280: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
a290: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
a2a0: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
a2b0: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
a2c0: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
a2d0: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
a2e0: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
a2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a300: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a310: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a330: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a340: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a350: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a360: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a370: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a380: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a390: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3a0: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a3b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
a3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3d0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a3e0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a3f0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a400: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a410: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a420: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a440: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a450: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
a460: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a470: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a480: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a490: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4a0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a4c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a4d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a4e0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
a4f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a510: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a530: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a540: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a550: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a560: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a570: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a580: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a5a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a5b0: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a5c0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a5d0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a5f0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a600: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a610: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a620: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a630: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a640: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a650: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a670: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a680: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6c0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a6d0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a6e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a6f0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a700: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a710: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a720: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a730: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a740: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a750: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a760: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a770: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a780: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a790: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a7a0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a7b0: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a7c0: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a7d0: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a7e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a800: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a810: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a820: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a830: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a840: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a850: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a860: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a870: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a880: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a890: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a8a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a8b0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a8c0: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a8d0: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a8e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a8f0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a900: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a910: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a920: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a930: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a940: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
a950: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
a960: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
a970: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
a980: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
a990: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
a9a0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
a9b0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
a9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a9d0: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
a9e0: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
a9f0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
aa00: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
aa10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
aa20: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
aa30: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
aa40: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
aa50: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
aa60: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
aa70: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
aa80: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
aa90: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
aaa0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
aab0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
aac0: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
aad0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
aae0: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
aaf0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
ab00: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
ab10: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
ab20: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
ab30: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
ab40: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
ab50: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
ab60: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
ab70: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
ab80: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
ab90: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
aba0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
abc0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
abd0: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
abe0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
abf0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
ac00: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
ac10: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ac20: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
ac30: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
ac40: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
ac50: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ac60: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
ac70: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
ac80: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
ac90: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
aca0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
acb0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
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 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
acf0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
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 45 52 52 4f  tate==PAGER_ERRO
ad20: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
ad30: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
ad40: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ad50: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
ad60: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
ad70: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
ad80: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
ad90: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
ada0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
adb0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
adc0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
add0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
ade0: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
adf0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
ae00: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
ae10: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
ae20: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
ae30: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
ae40: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
ae50: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
ae60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
ae70: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
ae80: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
ae90: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aea0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aeb0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
aec0: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
aed0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aee0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aef0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
af00: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
af10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
af30: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
af40: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
af50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
af70: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
af80: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
af90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
afa0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
afb0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
afc0: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
afd0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
afe0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aff0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b000: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b010: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b020: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b030: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b040: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b050: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b060: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b070: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b080: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b090: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b0a0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b0b0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b0c0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b0d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b0e0: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b0f0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b100: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b110: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b120: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b130: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b140: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b150: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b160: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b170: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b180: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b190: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b1a0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b1b0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b1c0: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b1d0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b1e0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b1f0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b200: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b210: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b220: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b230: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b240: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b250: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b260: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b270: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b280: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b290: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b2a0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b2b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b2c0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b2d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b2e0: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b2f0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b300: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b310: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b320: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b330: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b340: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b350: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b370: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b380: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b390: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b3a0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b3b0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b3c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b3e0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b3f0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b400: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b410: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b420: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b430: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b450: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b460: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b470: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b480: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b490: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b4a0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b4b0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b4c0: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b4d0: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b4e0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b4f0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b500: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b510: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b520: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b530: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b540: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b550: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b560: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b570: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b590: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b5a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b5b0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b5c0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b5e0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b5f0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b610: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b620: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b630: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b640: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b650: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b660: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b670: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b680: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b690: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b6a0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b6b0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b6c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b6d0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b6e0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b6f0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b700: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b710: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b730: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b740: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b750: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b760: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b770: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b780: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b790: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b7a0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b7c0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b7d0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b7e0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b7f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b800: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b810: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b820: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b830: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b840: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b850: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b860: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b870: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b880: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b890: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b8a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b8b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b8c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b8e0: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b8f0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b920: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b930: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b940: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b950: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b960: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b970: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b980: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b990: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b9a0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b9b0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b9c0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b9d0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b9e0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b9f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
ba00: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
ba10: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
ba20: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
ba30: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
ba40: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
ba50: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
ba60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
ba70: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
ba80: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
ba90: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
baa0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
bab0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
bac0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bad0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
bae0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
baf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
bb00: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
bb20: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
bb30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
bb40: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
bb50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bb60: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bb70: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bb80: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bb90: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
bba0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bbb0: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bbc0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bbd0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bbe0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bbf0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bc00: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bc10: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bc20: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bc30: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bc40: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bc50: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bc60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bc70: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bc80: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bc90: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bca0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bcb0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bcc0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bcd0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bce0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bcf0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bd00: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd20: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bd30: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bd40: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bd50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bd60: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bd70: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bd80: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bd90: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bda0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bdb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bdc0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bdd0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bde0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bdf0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
be00: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
be10: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
be20: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
be30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
be40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
be50: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
be60: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
be70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
be80: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
be90: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bea0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
beb0: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bec0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bed0: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bee0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bef0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bf00: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bf10: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf20: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bf30: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bf40: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bf50: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bf60: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bf70: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bf80: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bf90: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bfa0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bfb0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bfc0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bfd0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bfe0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bff0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c000: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c010: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c020: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c030: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c040: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c050: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
c060: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
c070: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
c080: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
c090: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
c0a0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c0b0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c0c0: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c0d0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c0e0: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c0f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c100: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c110: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c120: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c130: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c140: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c150: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c160: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c170: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c180: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c190: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c1a0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c1b0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c1d0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c1e0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c1f0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c200: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c210: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c220: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c230: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c260: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c270: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c280: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c2a0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c2b0: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c2e0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c2f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c300: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c310: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c320: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c330: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c340: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c350: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c360: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c370: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c380: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c390: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c3a0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c3b0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c3c0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c3d0: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c3e0: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c3f0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c400: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c410: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c420: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c440: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c450: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c460: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c470: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c480: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c490: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c4a0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c4b0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c4c0: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c4d0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c4e0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c4f0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c500: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c510: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c520: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c530: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c540: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c550: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c560: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c570: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c580: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c590: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c5a0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c5b0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c5c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c5d0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c5e0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c5f0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c600: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c610: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c620: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c630: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c640: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c650: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c660: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c670: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c680: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c690: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c6a0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c6b0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c6c0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c6d0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c6e0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c700: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c710: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c720: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c730: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c740: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c750: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c760: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c770: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c780: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c790: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c7a0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c7b0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c7c0: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c7d0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c7e0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c7f0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c800: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c810: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c820: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c830: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c840: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c850: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c860: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c870: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c880: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c890: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c8a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c8b0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c8c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c8d0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c8e0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c8f0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c900: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c910: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c920: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c930: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c940: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c950: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c960: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c970: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c980: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c990: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c9b0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c9c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9d0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c9e0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c9f0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
ca00: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
ca10: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
ca20: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
ca30: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
ca40: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
ca50: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
ca60: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
ca70: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
ca80: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
ca90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
caa0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cab0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cac0: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cad0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cae0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
caf0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cb00: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cb10: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cb20: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cb30: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cb40: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cb50: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cb60: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cb70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cb80: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cb90: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cba0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cbb0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cbc0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cbd0: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cbe0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cbf0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cc00: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cc10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cc20: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cc30: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cc40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cc50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cc60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cc70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cc80: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cc90: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cca0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ccb0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ccc0: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ccd0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cce0: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ccf0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cd00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cd10: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cd20: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cd30: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cd40: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cd50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cd60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cd70: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cd80: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cd90: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cda0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cdb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cdc0: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cde0: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cdf0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ce00: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ce10: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
ce20: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
ce30: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
ce40: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ce50: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
ce60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ce70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ce80: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
ce90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cea0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ceb0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cec0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ced0: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cef0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cf00: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cf10: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cf20: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cf40: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cf50: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cf60: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cf90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cfa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cfb0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cfc0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cfd0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cfe0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cff0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d000: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d010: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d020: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d030: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d040: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d050: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d060: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d070: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d080: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d090: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d0b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d0c0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d0d0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d0e0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d100: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d110: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d120: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d130: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d140: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d150: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d160: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d170: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d180: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d190: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d1a0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d1b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d1c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d1d0: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d1e0: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d1f0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d200: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d210: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d220: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d230: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d240: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d250: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d260: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d270: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d280: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d290: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d2a0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d2b0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d2c0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2e0: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d2f0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d300: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d310: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d320: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d330: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d340: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d370: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d380: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d390: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d3a0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d3b0: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d3d0: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d3e0: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d3f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d400: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d410: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d420: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d430: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d440: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d450: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d4d0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d4e0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d4f0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d500: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d510: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d520: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d530: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d540: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d550: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d560: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d570: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d580: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d590: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d5a0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d5b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d5c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d5d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d5e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5f0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d600: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d610: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d620: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d630: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d640: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d670: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d690: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d6b0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d6c0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d6d0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d6e0: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d6f0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d700: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d710: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d720: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d730: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d740: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d750: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d760: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d770: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d780: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d790: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d7a0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d7b0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d7c0: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d7d0: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d7e0: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d7f0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d800: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d820: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d830: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d840: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d850: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d860: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d870: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d880: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d890: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d8a0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d8b0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d8c0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d8d0: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d8e0: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d8f0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d900: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d910: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d920: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d930: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d940: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d950: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d960: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d970: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d980: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d990: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d9a0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d9b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d9c0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d9d0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d9e0: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d9f0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
da00: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
da10: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
da20: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
da30: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
da40: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
da50: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
da60: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
da70: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
da80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
dab0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
dac0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
dad0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
dae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daf0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
db00: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
db20: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
db30: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
db40: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
db50: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
db60: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
db70: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
db80: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
db90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dba0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dbb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dbc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dbd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dbe0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dbf0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dc00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dc10: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dc20: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dc30: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dc40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dc50: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dc60: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dc80: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dc90: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dca0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dcb0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dcc0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dcd0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dce0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dcf0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dd00: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dd10: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dd20: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dd30: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dd40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dd50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dd60: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dd70: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dd80: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dd90: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dda0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
ddb0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
ddc0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
ddd0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dde0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
ddf0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
de00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
de10: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
de20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de30: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
de40: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
de50: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
de60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
de70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
de80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
de90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
dea0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
deb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dec0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
ded0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
dee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
def0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
df00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
df10: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
df20: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
df30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
df40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
df50: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
df60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
df70: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
df80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
df90: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
dfa0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
dfb0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
dfc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
dfd0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
dfe0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
dff0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e000: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e010: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e020: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e030: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e040: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e050: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e060: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e070: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e080: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e090: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e0a0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e0b0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e0c0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e0d0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e0e0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e0f0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e100: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e110: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e120: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e130: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e140: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e150: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e160: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e170: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e190: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e1c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e1d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e1e0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e1f0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e200: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e210: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e220: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e230: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e240: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e250: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e260: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e290: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e2a0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e2b0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e2e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e2f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e300: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e310: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e320: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e330: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e340: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e350: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e360: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e370: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e380: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e390: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e3a0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e3b0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e3c0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e3d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e3e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e3f0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e400: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e410: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e420: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e430: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e440: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e450: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e460: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e470: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e480: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e490: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e4a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e4b0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e4c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e4e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e4f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e500: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e510: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e520: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e530: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e540: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e550: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e560: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e570: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e580: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e590: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e5a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e5b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e5c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e5d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e5e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e5f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e600: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e610: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e620: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e630: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e640: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e650: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e660: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e670: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e680: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e690: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e6a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e6b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e6c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e6d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e6e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e6f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e700: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e720: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e730: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e740: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e750: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e760: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e770: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e780: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e790: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e7a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e7b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e7c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e7d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e7e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e7f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e800: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e810: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e820: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e830: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e840: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e850: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e860: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e870: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e880: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e890: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e8a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e8b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e8c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e8d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e8e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e8f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e900: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e910: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e920: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e930: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e950: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e960: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e970: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e980: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e990: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e9a0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e9b0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e9c0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e9d0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e9e0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e9f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
ea00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ea10: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
ea20: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ea30: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea40: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
ea50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
ea60: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
ea70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea80: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
ea90: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eaa0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eab0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eac0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ead0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eae0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eaf0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
eb00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb20: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
eb30: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
eb40: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eb50: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eb60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eb70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eb80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eb90: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eba0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ebb0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ebc0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ebd0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ebe0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ebf0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ec00: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ec10: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ec20: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ec30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ec40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ec50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ec60: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ec70: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ec80: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ec90: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
eca0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ecb0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ecc0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ecd0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ece0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ecf0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ed00: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ed10: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ed20: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ed30: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ed40: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ed50: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ed60: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ed70: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ed80: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ed90: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
eda0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
edb0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
edc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
edd0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ede0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
edf0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ee00: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ee10: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ee20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ee30: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ee40: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ee50: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ee60: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ee70: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ee80: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ee90: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
eea0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
eeb0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
eec0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
eed0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
eee0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
eef0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ef00: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ef10: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ef20: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ef30: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ef40: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
ef50: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
ef60: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
ef70: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
ef80: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
ef90: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
efa0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
efb0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
efc0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
efd0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
efe0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
eff0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f000: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f010: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f020: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f030: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f040: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f050: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f060: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f070: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f080: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f090: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f0a0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f0b0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f0c0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f0d0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f0e0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f0f0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f100: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f110: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f120: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f130: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f140: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f150: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f160: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f170: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f180: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f190: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f1a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f1b0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f1c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f1d0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f1e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f1f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f200: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f210: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f220: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f230: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f240: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f250: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f260: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f270: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f280: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f290: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f2a0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f2d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f2e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f2f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f300: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f310: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f320: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f330: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f340: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f350: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f360: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f370: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f390: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f3a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3b0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f3c0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f3d0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f3e0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f3f0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f410: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f420: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f430: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f440: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f460: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f470: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f480: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f490: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f4a0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f4b0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f4c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f4d0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f4e0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f4f0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f500: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f510: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f520: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f530: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f540: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f550: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f560: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f570: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f580: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f590: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f5a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f5b0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f5c0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f5d0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f5e0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f5f0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f610: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f620: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f630: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f640: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f650: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f660: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f670: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f680: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f690: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f6a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6b0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f6c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f6d0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f6e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f6f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f700: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f710: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f720: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f740: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f750: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f760: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f770: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f7a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f7b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f7c0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f7d0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f7e0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f7f0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f810: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f820: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f830: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f840: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f850: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f860: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f870: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f880: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f890: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f8a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f8b0: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f8c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f8d0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f8e0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f8f0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f900: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f910: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f920: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f930: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f940: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f950: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f960: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f970: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f990: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f9a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f9b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f9c0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f9d0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f9e0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f9f0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fa00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fa10: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fa20: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fa30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fa40: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fa50: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fa60: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fa70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fa80: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fa90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
faa0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fab0: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fac0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fad0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fae0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
faf0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fb00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fb10: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fb20: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb30: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fb40: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fb50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fb70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fb80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fb90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fbb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fbc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fbd0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fbe0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fc00: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fc10: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fc20: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fc30: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fc40: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fc50: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fc60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fc70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fc80: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fc90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fca0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fcb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fcc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fcd0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fce0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fcf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fd20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fd30: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fd40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fd70: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fd80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fd90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fda0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fdb0: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fdc0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fdd0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fde0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fdf0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fe00: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fe10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fe20: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fe30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fe40: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fe50: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fe60: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fe70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fe80: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fe90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fea0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
feb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fec0: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fed0: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fee0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fef0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff00: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ff10: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ff20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ff30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
ff40: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
ff50: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
ff60: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
ff70: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
ff80: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
ff90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
ffa0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ffb0: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ffc0: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ffd0: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ffe0: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
fff0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10000 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10010 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10020 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10030 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10040 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10060 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10070 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10080 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10090 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
100a0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
100b0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
100c0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
100d0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
100e0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
100f0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10100 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10110 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10120 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10130 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10140 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10150 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10160 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10170 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10180 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10190 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
101a0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
101b0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
101c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
101d0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
101e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
101f0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10200 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10210 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10220 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10230 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10240 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10250 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10260 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10270 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10280 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10290 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
102a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
102b0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
102c0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
102d0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
102e0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
102f0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10300 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10310 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10320 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10340 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10350 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10360 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10370 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10380 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10390 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
103a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
103b0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
103c0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
103d0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
103e0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
103f0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10400 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10410 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10420 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10440 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10450 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10460 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10480 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10490 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
104a0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
104b0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
104c0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
104d0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
104e0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
104f0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10500 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10510 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10520 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10530 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10540 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10550 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10560 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10570 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10580 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10590 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
105a0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
105b0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
105c0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
105d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
105e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
105f0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10600 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10610 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10620 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10630 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10650 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10660 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10670 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10680 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10690 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
106a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
106b0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
106c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
106d0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
106e0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
106f0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10700 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10710 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10720 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10730 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10740 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10750 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10760 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10770 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10780 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10790 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
107a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
107b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
107c0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
107d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
107e0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
107f0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10800 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10810 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10820 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10830 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10840 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10860 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10870 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10880 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10890 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
108a0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
108b0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
108c0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
108d0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
108e0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
108f0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10900 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10910 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10920 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10930 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10940 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10950 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10960 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10970 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10980 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10990 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
109a0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
109b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
109c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
109d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10a00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10a10 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a30 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10a40 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10a50 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10a80 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10a90 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10aa0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10ac0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10ad0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10ae0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10b10 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10b20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10b30 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10b40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10b60 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10b70 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10b90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10ba0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10bb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10bc0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10be0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10bf0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10c10 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10c30 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10c40 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10c50 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10c60 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10c70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10c80 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10c90 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10ca0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10cb0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10cc0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10cd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10ce0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10cf0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10d00 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10d10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10d20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10d30 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10d40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10d50 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10d60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10d70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10d80 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10d90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10da0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10db0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10dc0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10de0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10df0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10e00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10e10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10e20 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10e40 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10e50 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10e60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10e70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10e80 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10e90 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10ea0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10eb0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10ec0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10ed0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10ef0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10f00 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10f10 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10f20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10f30 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10f40 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10f50 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10f60 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10f70 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10f80 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10f90 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10fa0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10fb0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10fd0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10fe0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11020 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11040 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11050 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11060 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11070 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11080 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11090 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
110a0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
110b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
110c0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
110d0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
110e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
110f0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11100 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11110 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11120 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11130 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11140 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11150 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11160 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11170 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11180 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11190 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
111a0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
111b0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
111c0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
111d0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
111e0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
111f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11200 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11210 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11220 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11230 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11240 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11250 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11260 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11270 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11280 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11290 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
112a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112b0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
112c0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
112d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
112e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112f0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11310 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11320 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11330 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11340 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11350 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11360 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11370 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11380 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11390 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
113a0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
113b0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
113c0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
113d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
113e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
113f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11400 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11410 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11420 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11430 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
11440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11450 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11460 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11470 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11490 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
114a0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
114b0 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
114c0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
114d0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
114e0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
114f0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11500 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11510 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11520 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11530 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11540 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11550 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11560 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11570 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11580 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11590 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
115a0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
115b0 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
115c0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
115d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
115e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
115f0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11600 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11610 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11620 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11630 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11640 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11650 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11660 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11670 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11680 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11690 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
116a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
116b0 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
116c0 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
116d0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
116e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
116f0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11700 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11710 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11720 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11730 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11740 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11750 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11760 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11770 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11780 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11790 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
117a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
117b0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
117c0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
117d0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
117e0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
117f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11800 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
11810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11820 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11830 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11850 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11860 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11870 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11880 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11890 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
118a0 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
118b0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
118c0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
118d0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
118e0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
118f0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11900 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
11910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11920 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11950 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11960 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11980 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11990 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
119a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
119b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
119c0 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
119d0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
119e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
119f0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11a00 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
11a10 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11a20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11a30 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11a40 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11a60 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11a70 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11a80 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11a90 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11aa0 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11ab0 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11ac0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11ad0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11af0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11b00 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
11b10 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11b20 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11b30 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11b40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11b50 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11b60 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11b70 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11b80 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11b90 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11ba0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11bb0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11bc0 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11bd0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11be0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11bf0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11c00 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11c10 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11c20 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11c30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11c40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11c50 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11c60 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11c70 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11c80 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11c90 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11cb0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11cc0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11ce0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11cf0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11d00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d10 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11d20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11d30 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11d40 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11d50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11d60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11d70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11d80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11d90 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11da0 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11db0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11dc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11dd0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11de0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11df0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11e00 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11e10 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11e30 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11e40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11e50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11e60 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11e70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11e90 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11ea0 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11eb0 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11ec0 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11ed0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11ee0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11ef0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11f00 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11f10 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11f20 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11f30 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11f40 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11f50 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11f60 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11f70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11f80 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11f90 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11fa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11fb0 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11fc0 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11fd0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11fe0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11ff0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
12000 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12010 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
12020 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12040 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12050 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12060 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12070 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12080 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12090 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
120a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
120b0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
120c0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
120d0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
120e0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
120f0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
12100 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12110 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
12120 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12130 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12140 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12150 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12160 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12170 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12180 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
121a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
121b0 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
121c0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
121d0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
121e0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
121f0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12200 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12210 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12220 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12230 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12240 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12250 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12260 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12270 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12280 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12290 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
122a0 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
122b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
122c0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
122d0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
122e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
122f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12300 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12310 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12320 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12330 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12350 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12360 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12370 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12380 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12390 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
123a0 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
123b0 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
123c0 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
123d0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
123e0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
123f0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12400 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12410 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12430 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12440 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12450 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12460 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12470 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12480 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12490 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
124a0 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
124b0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
124c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
124d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
124e0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
124f0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12500 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12510 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12520 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12530 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12540 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12550 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12560 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12570 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12580 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12590 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
125a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
125b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
125c0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
125d0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
125e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
125f0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12600 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
12610 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12620 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12630 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12640 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12650 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
12660 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
12670 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
12680 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
12690 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
126a0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
126b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
126c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
126d0 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
126e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12700 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12710 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12720 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12730 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12740 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
12750 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
12760 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12770 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
12780 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
12790 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
127a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
127b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
127c0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
127d0 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
127e0 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
127f0 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12800 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12810 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12820 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12830 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12840 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12850 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
12860 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12870 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
12880 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
12890 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
128a0 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
128b0 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
128c0 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
128d0 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
128e0 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
128f0 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12900 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12910 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12920 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12930 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12940 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
12950 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
12960 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
12970 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
12980 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
12990 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
129a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
129b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
129c0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
129d0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
129e0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
129f0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12a00 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12a10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12a20 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12a30 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12a40 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12a50 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12a60 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12a70 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12a80 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12a90 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12aa0 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12ab0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12ac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12ad0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12ae0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12af0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12b00 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12b10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12b20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12b30 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12b40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12b50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12b60 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12b70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12b80 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12b90 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12ba0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12bb0 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
12bc0 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
12bd0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
12be0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
12bf0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12c00 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12c10 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c30 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12c40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12c50 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
12c70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
12c80 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
12c90 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
12ca0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
12cb0 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
12cc0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
12cd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
12ce0 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
12cf0 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
12d00 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
12d10 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
12d20 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
12d30 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
12d40 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
12d50 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
12d60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12d70 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
12d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12d90 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
12da0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
12db0 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
12dc0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
12dd0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
12de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12df0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
12e00 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
12e10 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
12e20 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
12e30 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
12e40 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
12e50 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
12e60 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
12e70 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
12e80 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
12e90 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
12ea0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
12eb0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
12ec0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
12ed0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12ee0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
12ef0 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
12f00 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
12f10 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
12f20 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
12f30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12f40 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
12f50 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
12f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
12f70 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
12f80 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
12f90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
12fa0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
12fb0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
12fc0 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
12fd0 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
12fe0 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
12ff0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13000 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13010 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13020 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13030 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13040 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13050 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13060 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13070 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13080 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13090 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
130a0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
130b0 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
130c0 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
130d0 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
130e0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
130f0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13100 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13110 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13120 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13130 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13140 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13150 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13160 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13170 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13190 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
131a0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
131b0 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
131c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
131d0 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
131e0 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
131f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13200 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13220 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13240 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13250 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13260 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13270 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13280 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13290 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
132a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
132b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132c0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
132d0 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
132e0 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
132f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13300 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13310 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13320 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13330 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13340 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13350 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13360 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13370 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13380 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13390 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
133a0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
133b0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
133c0 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
133d0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
133e0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
133f0 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
13400 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
13410 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13420 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13430 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13440 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
13450 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13460 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13470 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
13480 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
13490 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
134a0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
134b0 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
134c0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
134d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
134e0 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
134f0 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
13500 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
13510 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13520 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13530 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13540 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13550 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
13560 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
13570 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
13580 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
13590 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
135a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
135b0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
135c0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
135d0 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
135e0 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
135f0 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13600 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13610 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13620 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13630 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13640 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
13650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13660 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13670 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
13680 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
13690 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
136a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
136b0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
136c0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
136d0 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
136e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
136f0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13700 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13710 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13720 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13730 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13740 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
13750 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
13760 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
13770 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
13780 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
13790 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
137a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
137b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
137c0 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
137d0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
137e0 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
137f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13800 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13810 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13820 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13830 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13840 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
13850 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
13860 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
13870 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
13880 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
13890 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
138a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
138b0 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
138c0 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
138d0 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
138e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
138f0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13900 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13910 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13920 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13930 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13940 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
13950 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
13960 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
13970 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13980 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
13990 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
139a0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
139b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
139c0 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
139d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
139e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
139f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13a00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13a20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13a30 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13a40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13a50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13a60 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13a70 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13a80 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13aa0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13ab0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13ac0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13ad0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13ae0 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13af0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13b00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13b10 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
13b20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
13b30 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
13b40 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
13b60 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13b70 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
13b80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13b90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13bb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13bc0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
13bd0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13be0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13c10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13c20 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13c30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13c90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13ca0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
13cb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13cc0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
13cd0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
13ce0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13cf0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
13d00 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
13d10 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
13d20 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
13d30 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
13d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13d50 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
13d60 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
13d70 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
13d80 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
13d90 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
13da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
13db0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
13dc0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
13dd0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
13de0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
13df0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
13e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13e10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13e20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13e30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
13e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13e50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13e60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13e90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ea0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13eb0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13ec0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13ee0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13ef0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13f00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13f10 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13f20 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13f40 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13f60 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
13f70 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
13f80 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
13f90 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
13fa0 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
13fb0 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
13fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
13fd0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
13fe0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
13ff0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
14000 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
14010 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
14020 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
14030 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
14040 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
14050 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
14060 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
14070 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  nal. .      */. 
14080 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14090 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d   = (!pPager->tem
140a0 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  pFile && sqlite3
140b0 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50  JournalExists(pP
140c0 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20  ager->jfd));.   
140d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
140e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
140f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14100 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
14110 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14120 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14130 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14140 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14150 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14160 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14170 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14180 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14190 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
141a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
141b0 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
141c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
141d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
141e0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
141f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
14200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14210 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14220 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14230 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
14240 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14250 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14260 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14270 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14280 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14290 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
142a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
142b0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
142c0 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50  dr *p = sqlite3P
142d0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
142e0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
142f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
14300 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
14310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
14320 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20  efNotNull(p);.  
14330 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14340 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
14350 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
14360 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
14370 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
14380 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14390 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
143a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
143b0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
143c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
143d0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
143e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
143f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
14400 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
14410 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
14420 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
14430 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
14440 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
14450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
14460 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
14470 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14480 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
14490 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
144a0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
144b0 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
144c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
144d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
144e0 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
144f0 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
14500 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
14510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
14520 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
14530 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
14540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
14550 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
14560 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
14570 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
14580 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14590 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
145a0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
145b0 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
145c0 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
145d0 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
145e0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
145f0 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
14600 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
14610 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
14620 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14630 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14640 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
14650 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
14660 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
14670 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
14680 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
14690 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
146a0 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
146b0 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
146c0 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
146d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
146e0 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
146f0 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
14700 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
14710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14720 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
14730 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
14740 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
14750 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
14760 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
14770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14780 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14790 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
147a0 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
147b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
147c0 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
147d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
147e0 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
147f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
14800 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14810 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14820 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14830 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14840 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
14850 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14860 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
14870 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
14880 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
14890 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
148a0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
148b0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
148c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
148d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
148e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
148f0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
14900 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
14910 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
14920 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
14930 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
14950 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
14960 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14970 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
14980 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
14990 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
149a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
149b0 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
149c0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
149d0 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
149e0 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
149f0 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
14a00 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
14a10 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
14a20 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
14a30 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14a40 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
14a50 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
14a60 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
14a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14a80 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
14a90 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
14aa0 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
14ab0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
14ac0 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
14ad0 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
14ae0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
14af0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
14b00 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
14b10 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
14b20 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
14b30 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
14b40 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
14b50 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
14b60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
14b70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
14b80 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14b90 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
14ba0 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
14bb0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14bc0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14bd0 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
14be0 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
14bf0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14c00 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14c10 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
14c20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
14c30 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14c40 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
14c50 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
14c60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14c70 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14c80 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14c90 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14ca0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14cb0 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
14cc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
14cd0 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
14ce0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14cf0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14d00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14d10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
14d20 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
14d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
14d40 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14d60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
14d70 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14d80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14d90 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
14da0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
14db0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14dd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
14de0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
14df0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
14e00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14e10 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
14e20 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
14e30 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
14e40 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
14e50 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
14e60 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
14e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
14e80 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
14e90 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
14ea0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
14eb0 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
14ec0 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
14ed0 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
14ee0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
14ef0 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
14f00 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
14f10 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
14f20 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
14f30 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
14f40 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
14f50 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
14f60 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
14f70 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
14f80 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
14f90 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
14fa0 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
14fb0 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
14fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
14fd0 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
14fe0 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
14ff0 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15000 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15010 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15020 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15030 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15040 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15050 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15060 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15070 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15080 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15090 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
150a0 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
150b0 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
150c0 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
150d0 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
150e0 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
150f0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15100 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15110 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15120 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15130 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15140 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15150 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15160 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15170 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15180 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15190 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
151a0 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
151b0 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
151c0 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
151d0 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
151e0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
151f0 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
15200 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
15210 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
15220 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
15230 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15240 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
15250 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
15260 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15270 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
15280 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
15290 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
152a0 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
152b0 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
152c0 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
152d0 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
152e0 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
152f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
15300 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
15310 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
15320 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
15330 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
15340 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
15350 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
15360 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
15370 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
153a0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
153b0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
153c0 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
153d0 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
153e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
15410 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
15420 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
15430 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
15440 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
15450 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
15460 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
15470 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
15480 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15490 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
154a0 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
154b0 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
154c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
154d0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
154e0 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
154f0 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
15500 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
15510 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
15520 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
15530 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15540 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
15550 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
15560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15570 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
15580 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
15590 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
155a0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
155b0 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
155c0 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
155d0 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
155e0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
155f0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
15600 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
15610 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
15620 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
15630 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
15640 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
15650 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
15660 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
15670 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
15680 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
15690 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
156a0 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
156b0 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
156c0 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
156d0 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
156e0 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
156f0 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
15700 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
15710 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
15720 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
15730 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
15740 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
15750 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
15760 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15770 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
15780 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15790 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
157a0 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
157b0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
157c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
157d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
157e0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
157f0 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
15800 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
15810 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
15820 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15830 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
15840 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
15850 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
15860 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
15870 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
15880 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
15890 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
158a0 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
158b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
158c0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
158d0 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
158e0 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
158f0 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
15900 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
15910 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15920 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
15930 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
15940 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
15950 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
15960 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
15970 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
15980 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
15990 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
159a0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
159b0 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
159c0 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
159d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
159e0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
159f0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
15a00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
15a10 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
15a20 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15a30 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
15a40 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
15a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
15a60 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15a70 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
15a80 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
15a90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15aa0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15ab0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
15ac0 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
15ad0 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
15ae0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
15af0 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
15b00 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
15b10 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
15b20 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
15b30 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
15b40 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
15b50 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
15b60 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
15b70 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
15b80 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
15b90 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
15ba0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
15bc0 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
15bd0 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
15be0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
15bf0 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
15c00 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
15c10 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
15c20 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
15c30 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
15c40 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
15c50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
15c60 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15c70 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
15c80 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
15c90 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
15ca0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
15cb0 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
15cc0 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
15cd0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
15ce0 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
15cf0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
15d00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15d10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15d20 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
15d30 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
15d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15d50 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
15d60 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
15d70 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
15d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15d90 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
15da0 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
15db0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15dd0 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
15de0 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
15df0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
15e00 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
15e10 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
15e20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
15e30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
15e40 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
15e50 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
15e60 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
15e70 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15e80 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
15e90 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
15ea0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
15eb0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
15ec0 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
15ed0 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
15ee0 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
15ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15f00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
15f10 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
15f20 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15f50 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
15f60 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
15f70 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
15f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15f90 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
15fa0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
15fb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
15fc0 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
15fd0 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
15fe0 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
15ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16000 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16030 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16040 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
16050 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
16060 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
16070 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
16080 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16090 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
160a0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
160b0 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
160c0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
160d0 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
160e0 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
160f0 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
16100 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
16110 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
16120 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
16130 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
16140 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
16150 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
16160 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
16170 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
16180 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
16190 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
161a0 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
161b0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
161c0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
161d0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
161e0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
161f0 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
16200 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
16210 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
16220 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20  tate is greater 
16230 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45  than PAGER_WRITE
16240 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72  R_CACHEMOD (a tr
16250 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
16260 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
16270 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68  lback done at th
16280 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65  e request of the
16290 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73   caller) or this
162a0 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   is.  ** a hot-j
162b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
162c0 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d   If it is a hot-
162d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
162e0 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  , the pager.  **
162f0 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45   is in state OPE
16300 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45  N and holds an E
16310 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48  XCLUSIVE lock. H
16320 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16330 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ack.  ** only re
16340 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ads from the mai
16350 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74  n journal, not t
16360 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
16370 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16380 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16390 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
163a0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28  EMOD.       || (
163b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
163c0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
163d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
163e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
163f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16400 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
16410 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
16420 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  D || isMainJrnl 
16430 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
16440 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
16450 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
16460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
16470 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
16480 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
16490 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
164a0 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
164b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
164c0 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
164d0 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
164e0 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
164f0 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
16500 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
16510 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
16520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16530 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16550 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
16560 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16570 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
16580 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
16590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
165a0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
165b0 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
165c0 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
165d0 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
165e0 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
165f0 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
16600 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
16610 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
16620 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
16630 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
16640 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
16650 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
16660 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
16670 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
16680 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
16690 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
166a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
166b0 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
166c0 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
166d0 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
166e0 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
166f0 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
16700 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
16710 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
16720 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
16730 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
16740 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
16750 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
16760 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16770 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
16780 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
16790 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
167a0 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
167b0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
167c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
167d0 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
167e0 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
167f0 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
16800 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
16810 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
16820 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16830 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
16840 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
16850 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
16860 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
16870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16880 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
16890 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
168a0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
168b0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
168c0 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  k before during 
168d0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
168e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
168f0 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
16900 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
16910 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
16920 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
16930 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
16940 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
16950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16960 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16970 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
16980 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
16990 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
169a0 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
169b0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
169c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
169d0 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
169e0 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
169f0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
16a00 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
16a10 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16a20 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
16a30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
16a40 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
16a50 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
16a60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
16a70 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
16a80 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
16a90 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
16aa0 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
16ab0 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
16ac0 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
16ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16ae0 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
16af0 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
16b00 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
16b10 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
16b20 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
16b30 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
16b40 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
16b50 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
16b60 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
16b70 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
16b80 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
16b90 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
16ba0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
16bb0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
16bc0 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
16bd0 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
16be0 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
16bf0 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
16c00 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
16c10 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
16c20 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
16c30 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
16c40 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
16c50 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
16c60 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
16c70 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
16c80 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
16c90 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
16ca0 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
16cb0 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
16cc0 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
16cd0 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
16ce0 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
16cf0 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
16d00 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
16d10 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
16d20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
16d30 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
16d40 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
16d50 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
16d60 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
16d70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16d80 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
16d90 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16da0 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
16db0 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
16dc0 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
16dd0 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
16de0 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
16df0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
16e00 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
16e10 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
16e20 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
16e30 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
16e40 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
16e50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
16e60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16e70 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
16e80 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
16e90 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
16ea0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
16eb0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
16ec0 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
16ed0 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
16ee0 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
16ef0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
16f00 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
16f10 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
16f20 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
16f30 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
16f40 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
16f50 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
16f60 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
16f70 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
16f80 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
16f90 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
16fa0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
16fb0 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
16fc0 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
16fd0 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
16fe0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
16ff0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
17000 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
17010 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
17020 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
17030 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
17040 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
17050 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
17060 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
17070 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
17080 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
17090 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
170a0 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
170b0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
170c0 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
170d0 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
170e0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
170f0 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
17100 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
17110 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
17120 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
17130 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
17140 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
17150 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
17160 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
17170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
17180 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
17190 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
171a0 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
171b0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
171c0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
171d0 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
171e0 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
171f0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17200 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
17210 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
17220 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
17230 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
17240 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
17250 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
17260 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17270 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
17280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
17290 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
172a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
172b0 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
172c0 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
172d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
172e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
172f0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
17300 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
17310 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
17320 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17330 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
17340 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17350 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
17360 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
17370 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
17380 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
17390 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
173a0 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
173b0 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
173c0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
173d0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
173e0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
173f0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
17400 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
17410 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
17420 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
17430 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
17440 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
17450 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17460 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
17470 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
17480 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
17490 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
174a0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
174b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
174c0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
174d0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
174e0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
174f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17500 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17510 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
17520 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
17530 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
17540 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
17550 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17560 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17570 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
17580 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17590 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
175a0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
175b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
175c0 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
175d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
175e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
175f0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
17600 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
17610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
17620 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
17630 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
17640 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
17650 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17660 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
17670 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
17680 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
17690 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
176a0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
176b0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
176c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
176d0 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
176e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
176f0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
17700 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
17710 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
17720 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
17730 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
17740 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
17750 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
17760 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
17770 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
17780 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
17790 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
177a0 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
177b0 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
177c0 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
177d0 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
177e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
177f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
17800 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
17810 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
17820 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
17830 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
17840 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
17850 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
17860 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
17870 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
17880 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
17890 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
178a0 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
178b0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
178c0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
178d0 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
178e0 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
178f0 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
17900 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17910 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17920 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
17930 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
17940 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
17950 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
17960 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
17970 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
17980 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
17990 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
179a0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
179b0 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
179c0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
179d0 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
179e0 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
179f0 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
17a00 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
17a10 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
17a20 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
17a30 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
17a40 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
17a50 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
17a60 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
17a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
17a80 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73  avepnt );.    as
17a90 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
17aa0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
17ab0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d  LFLAG_ROLLBACK)=
17ac0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
17ad0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
17ae0 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17af0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  CK;.    rc = sql
17b00 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
17b10 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c  ger, pgno, &pPg,
17b20 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
17b30 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
17b40 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
17b50 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b  _ROLLBACK)!=0 );
17b60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17b70 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c  otSpill &= ~SPIL
17b80 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
17b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17ba0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17bb0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
17bc0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
17bd0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17be0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17bf0 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17c00 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17c10 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17c20 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17c30 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17c40 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17c50 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17c60 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17c70 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
17c80 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
17c90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
17ca0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
17cb0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
17cc0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
17cd0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17ce0 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17cf0 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17d00 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17d10 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17d20 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17d30 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17d40 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17d50 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17d60 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17d70 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
17d80 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
17d90 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17da0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
17db0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
17dc0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
17dd0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17de0 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17df0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17e00 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17e10 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17e20 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17e30 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17e40 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17e50 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17e60 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17e70 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
17e80 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
17e90 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
17ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17eb0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
17ec0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
17ed0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17ee0 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17ef0 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17f00 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17f10 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17f20 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17f30 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17f40 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17f50 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17f60 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17f70 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
17f80 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
17f90 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
17fa0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
17fb0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
17fc0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
17fd0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17fe0 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17ff0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
18000 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
18010 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
18020 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
18030 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
18040 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
18050 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
18060 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
18070 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
18080 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
18090 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
180a0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
180b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
180c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
180d0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
180e0 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
180f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
18100 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
18110 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
18120 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
18130 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
18140 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
18150 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
18160 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
18170 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
18180 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
18190 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
181a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
181b0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
181c0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
181d0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
181e0 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
181f0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
18200 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
18210 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
18220 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
18230 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
18240 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
18250 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
18260 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
18270 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
18280 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
18290 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
182a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
182b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
182c0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
182d0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
182e0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
182f0 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
18300 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
18310 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
18320 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
18330 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
18340 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
18350 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
18360 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
18370 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
18380 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
18390 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
183a0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
183b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
183c0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
183d0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
183e0 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
183f0 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
18400 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
18410 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
18420 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18430 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
18440 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
18450 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
18460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18470 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
18480 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
18490 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
184a0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
184b0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
184c0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
184d0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
184e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
184f0 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
18500 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
18510 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
18520 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
18530 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
18540 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18550 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
18560 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
18570 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
18580 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
18590 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
185a0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
185b0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
185c0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
185d0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
185e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
185f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18600 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
18610 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
18620 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
18630 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
18640 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
18650 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
18660 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
18670 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
18680 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
18690 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
186a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
186b0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
186c0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
186d0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
186e0 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
186f0 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
18700 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
18710 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
18720 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
18730 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
18740 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
18750 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
18760 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
18770 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
18780 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
18790 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
187a0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
187b0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
187c0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
187d0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
187e0 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
187f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18800 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
18810 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18820 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18830 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
18840 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
18850 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
18860 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18870 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
18880 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
18890 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
188a0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
188b0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
188c0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
188d0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
188e0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
188f0 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
18900 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
18910 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
18920 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
18930 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
18940 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
18950 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
18960 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
18970 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
18980 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18990 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
189a0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
189b0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
189c0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
189d0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
189e0 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
189f0 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
18a00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
18a10 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
18a20 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
18a30 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
18a40 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18a50 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
18a60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
18a70 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
18a80 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
18a90 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
18aa0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
18ab0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
18ac0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
18ad0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
18ae0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
18af0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
18b00 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
18b10 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18b20 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
18b30 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
18b40 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
18b50 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
18b60 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
18b70 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18b80 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
18b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18ba0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
18bb0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
18bc0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
18bd0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18be0 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18bf0 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18c00 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18c10 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18c20 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18c30 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18c40 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18c50 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18c60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18c80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
18ca0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
18cb0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
18cc0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18cd0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18ce0 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18cf0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18d00 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18d10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18d20 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18d30 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18d40 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18d50 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18d60 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18d70 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
18d80 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
18d90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18da0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
18db0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
18dc0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
18dd0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18de0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18df0 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18e00 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18e10 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18e20 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18e30 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18e40 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18e50 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18e60 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18e70 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
18e80 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
18e90 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
18ea0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
18eb0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
18ec0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
18ed0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18ee0 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18ef0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18f00 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18f10 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18f20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18f30 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18f40 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18f50 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18f60 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18f70 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
18f80 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
18f90 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
18fa0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
18fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
18fd0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18fe0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18ff0 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
19000 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
19010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19020 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
19030 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
19040 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
19050 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19060 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19070 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
19080 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
19090 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
190a0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
190b0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
190c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
190d0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
190e0 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
190f0 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
19100 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
19110 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
19120 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
19130 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
19140 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
19150 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
19160 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
19170 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
19180 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
19190 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
191a0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
191b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
191c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
191d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
191e0 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
191f0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
19200 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
19210 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
19220 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
19230 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
19240 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
19250 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
19260 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19270 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
19280 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19290 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
192a0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
192b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
192c0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
192d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
192e0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
192f0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
19300 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
19310 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19320 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19330 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
19340 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
19350 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
19360 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
19370 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
19380 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
19390 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
193a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
193b0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
193c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
193d0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
193e0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
193f0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
19400 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
19410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19420 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
19430 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19440 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
19450 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
19460 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
19470 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
19480 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19490 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
194a0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
194b0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
194c0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
194d0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
194e0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
194f0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
19500 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
19510 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
19520 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
19530 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
19540 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19550 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19560 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
19570 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
19580 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19590 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
195a0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
195b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
195c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
195d0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
195e0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
195f0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19600 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19610 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19620 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19640 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19670 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19680 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19690 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
196a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
196b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
196c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
196d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
196e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
196f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19700 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19710 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19720 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19730 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19750 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19760 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19770 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19780 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19790 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
197a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
197b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
197c0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
197d0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
197e0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
197f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19800 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19810 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19820 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19830 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19840 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19850 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19860 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19870 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19880 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19890 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
198a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
198b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
198c0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
198d0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
198e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
198f0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19900 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19910 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19930 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19940 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19950 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19960 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19970 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19980 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19990 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
199a0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
199b0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
199c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
199d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
199e0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
199f0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19a00 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19a10 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19a20 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19a30 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19a40 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19a50 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19a60 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19a70 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19a80 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19a90 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
19aa0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
19ab0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
19ac0 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
19ad0 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
19ae0 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
19af0 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
19b00 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
19b10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
19b20 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
19b30 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
19b40 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
19b50 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
19b60 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
19b70 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
19b80 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
19b90 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
19ba0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
19bb0 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
19bc0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
19bd0 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
19be0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
19bf0 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
19c00 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
19c10 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
19c20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
19c30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19c40 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
19c50 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
19c60 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
19c70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
19c80 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
19c90 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
19ca0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
19cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
19cc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19cd0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
19ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19cf0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19d00 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
19d10 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
19d20 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
19d30 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
19d40 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
19d50 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
19d60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
19d70 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
19d80 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
19d90 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
19da0 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
19db0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
19dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
19dd0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
19de0 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
19df0 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
19e00 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
19e10 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
19e20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19e30 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
19e40 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
19e50 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
19e60 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
19e70 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
19e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19e90 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
19ea0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
19eb0 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
19ec0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
19ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
19ee0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
19ef0 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
19f00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
19f10 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67  urrentSize+szPag
19f20 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  e)<=newSize ){. 
19f30 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d         char *pTm
19f40 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  p = pPager->pTmp
19f50 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d  Space;.        m
19f60 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73  emset(pTmp, 0, s
19f70 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  zPage);.        
19f80 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
19f90 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75  ze-szPage) == cu
19fa0 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
19fb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
19fc0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
19fd0 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  >  currentSize )
19fe0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
19ff0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a000 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20  ager->fd, pTmp, 
1a010 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d  szPage, newSize-
1a020 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  szPage);.      }
1a030 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1a040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a050 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
1a060 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
1a070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a080 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a090 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1a0a0 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69   sanitized versi
1a0b0 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  on of the sector
1a0c0 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65  -size of OS file
1a0d0 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72   pFile. The.** r
1a0e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67  eturn value is g
1a0f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65  uaranteed to lie
1a100 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20   between 32 and 
1a110 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1a120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
1a130 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1a140 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1a150 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c    int iRet = sql
1a160 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1a170 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69  (pFile);.  if( i
1a180 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52  Ret<32 ){.    iR
1a190 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  et = 512;.  }els
1a1a0 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53  e if( iRet>MAX_S
1a1b0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
1a1c0 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
1a1d0 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
1a1e0 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58  ;.    iRet = MAX
1a1f0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1a200 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b  }.  return iRet;
1a210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1a220 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
1a230 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1a240 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
1a250 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
1a260 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
1a270 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1a280 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
1a290 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
1a2a0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1a2b0 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
1a2c0 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
1a2d0 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
1a2e0 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
1a2f0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
1a300 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
1a310 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1a320 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
1a330 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
1a340 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
1a350 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a360 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
1a370 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
1a380 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1a390 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1a3a0 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
1a3b0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
1a3c0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a3d0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
1a3e0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1a3f0 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1a400 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
1a410 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
1a420 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
1a430 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
1a440 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
1a450 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
1a460 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
1a470 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
1a480 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1a490 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c  file has the SQL
1a4a0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a4b0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72  AFE_OVERWRITE pr
1a4c0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74  operty, then set
1a4d0 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76  .** the effectiv
1a4e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f  e sector size to
1a4f0 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   its minimum val
1a500 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70  ue (512).  The p
1a510 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61  urpose of.** pPa
1a520 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a530 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  is to define the
1a540 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20   "blast radius" 
1a550 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a  of bytes that.**
1a560 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66   might change if
1a570 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
1a580 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
1a590 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1a5a0 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e  n.** that range.
1a5b0 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52    But with POWER
1a5c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20  SAFE_OVERWRITE, 
1a5d0 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73  the blast radius
1a5e0 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61   is zero.** (tha
1a5f0 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53  t is what POWERS
1a600 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65  AFE_OVERWRITE me
1a610 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69  ans), so we mini
1a620 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a  mize the sector.
1a630 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61  ** size.  For ba
1a640 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
1a650 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c  ility of the rol
1a660 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
1a670 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65  le format,.** we
1a680 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74   cannot reduce t
1a690 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a6a0 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35  tor size below 5
1a6b0 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
1a6c0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
1a6d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a6e0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1a6f0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1a700 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a710 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  e );..  if( pPag
1a720 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
1a730 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
1a740 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a750 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26  cs(pPager->fd) &
1a760 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1a770 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1a780 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a790 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1a7a0 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
1a7b0 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
1a7c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1a7d0 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
1a7e0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
1a7f0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1a800 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
1a810 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
1a820 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
1a830 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
1a840 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1a850 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
1a860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a870 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a880 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f  e = sqlite3Secto
1a890 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
1a8a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a8b0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
1a8c0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
1a8d0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
1a8e0 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
1a8f0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1a900 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
1a910 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
1a920 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
1a930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a940 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
1a950 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
1a960 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
1a970 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
1a980 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
1a990 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
1a9a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a9b0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1a9c0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
1a9d0 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
1a9e0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1a9f0 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
1aa00 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1aa10 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
1aa20 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
1aa30 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
1aa40 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1aa50 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
1aa60 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1aa70 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1aa80 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
1aa90 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
1aaa0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
1aab0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
1aac0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
1aad0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1aae0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
1aaf0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
1ab00 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
1ab10 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
1ab20 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
1ab30 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1ab40 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1ab50 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1ab60 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
1ab70 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
1ab80 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
1ab90 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
1aba0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1abb0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1abc0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
1abd0 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
1abe0 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
1abf0 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
1ac00 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
1ac10 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
1ac20 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
1ac30 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
1ac40 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
1ac50 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
1ac60 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
1ac70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1ac80 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
1ac90 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
1aca0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
1acb0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
1acc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
1acd0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
1ace0 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
1acf0 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
1ad00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ad10 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1ad20 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
1ad30 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
1ad40 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
1ad50 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
1ad60 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
1ad70 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
1ad80 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
1ad90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1ada0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
1adb0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
1adc0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
1add0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
1ade0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1adf0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
1ae00 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
1ae10 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
1ae20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1ae30 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
1ae40 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
1ae50 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1ae60 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1ae70 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1ae80 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1ae90 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1aea0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1aeb0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1aec0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1aed0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1aee0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1aef0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1af00 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1af10 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1af20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1af30 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1af40 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1af50 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1af60 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1af70 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1af80 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1af90 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1afa0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1afb0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1afc0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1afd0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1afe0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1aff0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1b000 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1b010 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1b020 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1b030 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1b040 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1b050 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1b060 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1b070 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1b080 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1b090 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1b0a0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1b0b0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1b0c0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1b0d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1b0e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b0f0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1b100 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1b110 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1b120 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1b130 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1b140 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1b150 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1b160 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1b170 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1b180 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1b190 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1b1a0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1b1b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1b1c0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1b1d0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1b1e0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1b1f0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1b200 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1b210 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1b220 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1b230 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1b240 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1b250 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b260 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1b270 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1b280 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1b290 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1b2a0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1b2b0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1b2c0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1b2d0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1b2e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1b2f0 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1b300 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1b310 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1b320 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1b330 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1b340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1b350 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1b360 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1b370 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1b380 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1b390 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1b3a0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1b3b0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1b3c0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1b3d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1b3e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1b3f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1b400 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1b410 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1b420 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1b430 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1b440 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b450 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b460 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1b470 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1b480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b490 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1b4a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1b4b0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4d0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1b4e0 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1b4f0 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1b500 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b510 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1b520 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1b530 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b550 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1b560 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b570 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1b580 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1b590 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1b5a0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1b5b0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1b5c0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1b5d0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1b5e0 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1b5f0 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1b600 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1b610 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1b620 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1b630 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1b640 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62   */.  int nPlayb
1b650 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ack = 0;       /
1b660 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1b670 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64  f pages restored
1b680 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
1b690 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1b6a0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1b6b0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1b6c0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1b6d0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1b6e0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1b6f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1b700 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1b710 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1b720 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1b730 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1b740 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1b750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b760 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b770 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1b780 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1b790 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1b7a0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1b7b0 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1b7c0 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1b7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1b7e0 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1b7f0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1b800 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1b810 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1b820 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1b830 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1b840 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1b850 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1b860 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1b870 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1b880 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1b890 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1b8a0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1b8b0 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1b8c0 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1b8d0 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1b8e0 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1b8f0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1b900 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1b910 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1b920 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1b930 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1b940 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1b950 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1b960 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1b970 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1b980 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1b990 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1b9a0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1b9b0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1b9c0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1b9d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1b9e0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1b9f0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ba00 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1ba10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ba20 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1ba30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ba40 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1ba50 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1ba60 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1ba70 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1ba80 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1ba90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1baa0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1bab0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bac0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1bad0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1bae0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1baf0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1bb00 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1bb10 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1bb20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1bb30 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1bb40 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1bb50 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1bb60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1bb70 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1bb80 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1bb90 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1bba0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1bbb0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1bbc0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bbd0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1bbe0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1bbf0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1bc00 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1bc10 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1bc20 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1bc30 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1bc40 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1bc50 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1bc60 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1bc70 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1bc80 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1bc90 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1bca0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1bcb0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1bcc0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1bcd0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1bce0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1bcf0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1bd00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bd10 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1bd20 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1bd30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1bd40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1bd50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bd60 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1bd70 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1bd80 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1bd90 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1bda0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1bdb0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1bdc0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1bdd0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1bde0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1bdf0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1be00 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1be10 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1be20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1be30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1be40 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1be50 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1be60 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1be70 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1be80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1be90 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1bea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1beb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bec0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1bed0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1bee0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1bef0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1bf00 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1bf10 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1bf20 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1bf30 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1bf40 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1bf50 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1bf60 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1bf70 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1bf80 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1bf90 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1bfa0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1bfb0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1bfc0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1bfd0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1bfe0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bff0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1c000 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1c010 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1c020 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1c030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c040 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1c050 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1c060 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1c070 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c080 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1c090 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1c0a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1c0b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c0c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c0d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c0e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c0f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c100 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c110 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c120 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c130 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c140 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c150 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c160 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c170 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c180 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c190 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c1a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c1b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c1c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c1d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c1e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c1f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c200 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c210 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c220 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c230 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c240 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c250 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c260 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c270 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c280 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c290 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c2a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c2b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c2c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c2d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c2e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c2f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c300 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c310 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c320 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c330 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c340 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c350 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c360 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c370 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c380 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c390 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c3a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c3b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c3c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c3d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c3e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c3f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1c400 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c410 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c420 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c430 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c440 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c450 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c460 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c470 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c480 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c490 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c4a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c4b0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c4c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c4d0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c4e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c4f0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c500 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c510 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c520 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c530 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c540 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c550 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c560 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c570 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c580 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c5a0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c5b0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c5c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c5f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c600 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c620 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c630 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c640 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c650 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c660 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c670 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c680 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c690 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c6a0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c6b0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c6c0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c6d0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c6e0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c6f0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1c700 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1c710 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1c720 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1c730 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1c740 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1c750 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1c760 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1c770 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1c780 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1c790 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1c7a0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1c7b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1c7c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c7d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c7e0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c800 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1c810 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1c820 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1c830 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1c840 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1c850 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1c860 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1c870 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1c880 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1c890 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1c8a0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1c8b0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1c8c0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1c8d0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1c8e0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1c8f0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1c900 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1c910 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1c920 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1c930 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c950 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1c960 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1c970 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1c980 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1c990 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1c9a0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1c9b0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1c9c0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1c9d0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1c9e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1c9f0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1ca00 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1ca10 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1ca20 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1ca30 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1ca40 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1ca50 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1ca60 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1ca70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1ca80 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1ca90 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1caa0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1cab0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1cac0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1cad0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1cae0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1caf0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1cb00 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1cb10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1cb20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1cb30 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1cb40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1cb50 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1cb60 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1cb70 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1cb80 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1cb90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1cba0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1cbb0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1cbc0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1cbd0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1cbe0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cbf0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1cc00 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1cc10 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1cc20 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1cc30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1cc40 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1cc50 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1cc60 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1cc70 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1cc80 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1cc90 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1cca0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1ccb0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1ccc0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1ccd0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1cce0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1ccf0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1cd00 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1cd10 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1cd20 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1cd30 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1cd40 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1cd50 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1cd60 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1cd70 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1cd80 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1cd90 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1cda0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cdb0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1cdc0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1cdd0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1cde0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1cdf0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1ce00 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1ce10 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1ce20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1ce30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ce40 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1ce50 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1ce60 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1ce70 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1ce80 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1ce90 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1cea0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ceb0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1cec0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1ced0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cee0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1cef0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1cf00 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1cf10 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1cf20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1cf30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1cf40 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cf50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1cf60 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1cf70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1cf80 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1cf90 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1cfa0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1cfb0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1cfc0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1cfd0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1cfe0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1cff0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1d000 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1d010 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1d020 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1d030 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d040 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d050 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1d060 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1d070 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1d080 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1d090 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1d0a0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1d0b0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d0c0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d0d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d0e0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d0f0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d100 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d110 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d120 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d130 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d140 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d150 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d160 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d170 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d180 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d190 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d1a0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d1b0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d1c0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d1d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d1e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d1f0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d200 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d220 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d230 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d240 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d250 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d260 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d270 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d280 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d290 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d2a0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d2b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d2c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d2d0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d2e0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d2f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d300 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d310 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d320 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d330 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d340 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d350 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d360 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d370 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d380 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d390 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d3a0 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d3b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d3c0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d3d0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d3e0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d3f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1d400 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1d410 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d420 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1d430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d440 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d450 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1d460 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1d470 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1d480 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d490 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1d4a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1d4b0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1d4c0 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1d4d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1d4e0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1d4f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d500 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1d510 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d520 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d530 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d540 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d550 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d560 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d570 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d580 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d590 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1d5a0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1d5b0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d5c0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d5d0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d5e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1d5f0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1d600 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1d610 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1d620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d630 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d650 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d660 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1d670 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1d680 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d690 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1d6a0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1d6b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1d6c0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1d6d0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1d6e0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1d6f0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1d700 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1d710 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1d720 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1d730 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1d740 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1d750 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1d760 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1d770 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1d780 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1d790 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1d7a0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1d7b0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1d7c0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1d7d0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1d7e0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1d7f0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1d800 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1d810 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1d820 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1d830 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d840 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1d850 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1d860 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1d870 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1d880 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1d890 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1d8a0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1d8b0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1d8c0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1d8d0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1d8e0 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1d8f0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1d900 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d910 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1d920 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1d930 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1d940 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1d950 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1d960 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1d970 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d990 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1d9a0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1d9b0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1d9c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1d9d0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d9e0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d9f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1da00 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1da10 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1da20 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1da30 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1da40 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1da50 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1da60 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1da70 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1da80 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1da90 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1daa0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1dab0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1dac0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1dad0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1dae0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1db00 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1db10 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1db20 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1db30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1db40 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1db50 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1db60 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1db70 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1db80 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1db90 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1dba0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1dbb0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1dbc0 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1dbd0 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1dbe0 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1dbf0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1dc00 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1dc10 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1dc20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1dc30 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1dc40 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1dc50 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1dc60 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1dc70 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1dc80 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1dc90 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1dca0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1dcb0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1dcc0 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1dcd0 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1dce0 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1dcf0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1dd00 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1dd10 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1dd20 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1dd30 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1dd40 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1dd50 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1dd60 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1dd70 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1dd80 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1dd90 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1dda0 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1ddb0 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1ddc0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1ddd0 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1dde0 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1ddf0 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1de00 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1de10 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1de20 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1de30 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1de40 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1de50 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1de60 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1de70 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1de80 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1de90 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1dea0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1deb0 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1dec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1ded0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1dee0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1def0 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1df00 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1df10 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1df20 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1df30 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1df40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1df50 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1df60 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1df70 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1df80 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1df90 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1dfa0 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1dfb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1dfc0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1dfd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1dfe0 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1dff0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1e000 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1e010 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1e020 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1e030 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1e040 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1e050 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1e060 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1e070 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1e080 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1e090 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e0a0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1e0b0 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1e0c0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1e0d0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1e0e0 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1e0f0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1e100 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1e110 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e120 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1e130 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1e140 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1e150 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1e160 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e170 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1e180 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1e190 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1e1a0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1e1b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e1c0 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1e1d0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1e1e0 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1e1f0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1e200 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1e210 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1e220 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1e230 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1e240 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1e250 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1e260 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1e270 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e280 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e290 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e2a0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1e2b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e2c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e2d0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1e2e0 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1e2f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1e300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e310 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1e320 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1e330 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e340 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1e350 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1e360 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1e370 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1e380 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1e390 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1e3a0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1e3b0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1e3c0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1e3d0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1e3e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1e3f0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1e400 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1e410 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1e420 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1e430 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1e440 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1e450 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1e460 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1e470 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1e480 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1e490 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1e4a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e4b0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1e4c0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1e4d0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1e4e0 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1e4f0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1e500 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1e510 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1e520 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1e530 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1e540 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1e550 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1e560 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1e570 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e580 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e590 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1e5a0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1e5b0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1e5c0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e5d0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1e5e0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1e5f0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e620 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1e630 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1e640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e650 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1e660 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1e670 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1e680 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1e690 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1e6a0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1e6b0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1e6c0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1e6d0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1e6e0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1e6f0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1e700 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1e710 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1e720 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1e730 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1e740 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1e750 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1e760 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1e770 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1e780 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1e790 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1e7a0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1e7b0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1e7c0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1e7d0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1e7e0 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1e7f0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1e800 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e810 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e820 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e830 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1e840 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1e850 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1e860 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1e870 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1e880 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1e890 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1e8a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1e8b0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1e8c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1e8d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e8e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1e8f0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1e900 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1e910 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1e920 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1e930 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1e940 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1e950 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1e960 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1e970 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1e980 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1e990 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1e9a0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1e9b0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1e9c0 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1e9d0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1e9e0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1e9f0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1ea00 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1ea10 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1ea20 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1ea30 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1ea40 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1ea50 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1ea60 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1ea70 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1ea80 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1ea90 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1eaa0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1eab0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1eac0 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eae0 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1eaf0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1eb00 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1eb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1eb20 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1eb30 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1eb40 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1eb70 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1eb80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ebb0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1ebc0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1ebd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ebe0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1ebf0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1ec00 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ec20 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1ec30 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1ec40 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1ec50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1ec60 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1ec70 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1ec80 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1ec90 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1eca0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1ecb0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1ecc0 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1ecd0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ece0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1ecf0 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1ed00 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1ed10 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1ed20 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1ed30 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1ed40 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1ed50 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1ed60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ed70 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1ed80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1ed90 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1eda0 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1edb0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1edc0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1edd0 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1ede0 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1edf0 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1ee00 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1ee10 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1ee20 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1ee30 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1ee40 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1ee50 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1ee60 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1ee70 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1ee80 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1ee90 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1eea0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1eeb0 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1eec0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1eed0 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1eee0 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1eef0 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1ef00 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1ef10 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1ef20 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1ef30 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1ef40 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1ef50 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1ef60 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1ef70 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1ef80 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1ef90 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1efa0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1efb0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1efc0 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1efd0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1efe0 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1eff0 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1f000 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1f010 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f020 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1f030 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1f040 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f050 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f060 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1f070 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1f080 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1f090 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1f0a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1f0b0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1f0c0 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1f0d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f0e0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f0f0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1f100 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f110 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1f120 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1f130 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1f140 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f150 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1f160 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1f170 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1f180 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f190 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1f1a0 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1f1b0 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1f1c0 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1f1d0 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1f1e0 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1f1f0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1f200 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1f210 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1f220 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1f230 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1f240 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1f250 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1f260 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1f270 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1f280 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1f290 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1f2a0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1f2b0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1f2c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f2f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1f300 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1f310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1f320 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1f330 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1f340 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f350 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f360 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f370 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f380 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1f390 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1f3a0 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1f3b0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f3c0 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1f3d0 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1f3e0 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1f3f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1f400 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1f410 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1f420 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1f430 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1f440 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1f450 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1f460 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1f470 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1f480 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1f490 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1f4a0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f4b0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f4c0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1f4d0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1f4e0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1f4f0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1f500 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1f510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f520 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1f530 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1f540 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
1f550 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
1f560 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1f570 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1f580 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1f590 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1f5a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f5b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f5c0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1f5d0 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1f5e0 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1f5f0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1f600 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1f610 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f620 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1f630 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1f640 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1f650 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1f660 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1f670 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1f680 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1f690 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f6a0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1f6b0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f6c0 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1f6d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1f6e0 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1f6f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1f700 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1f710 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1f720 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f730 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1f740 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1f750 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1f760 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1f770 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1f780 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1f790 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f7a0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1f7b0 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1f7c0 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1f7d0 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1f7e0 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1f7f0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1f800 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1f810 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1f820 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1f830 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1f840 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1f850 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1f860 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f870 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1f880 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1f890 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1f8a0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1f8b0 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1f8c0 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1f8d0 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1f8e0 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1f8f0 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1f900 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1f910 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1f920 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f930 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f950 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f960 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1f970 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1f980 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1f990 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75  ..  /* If the nu
1f9a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f9b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f9c0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1f9d0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c  rom the.  ** WAL
1f9e0 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74   sub-system, det
1f9f0 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20  ermine the page 
1fa00 63 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20  counte based on 
1fa10 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
1fa20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fa30 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
1fa40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fa50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
1fa60 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
1fa70 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
1fa80 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
1fa90 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
1faa0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1fab0 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1fac0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fad0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fae0 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1faf0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1fb00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1fb10 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1fb20 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1fb30 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1fb40 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1fb50 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1fb60 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1fb70 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1fb80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fb90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1fba0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fbb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1fbc0 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1fbd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1fbe0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1fbf0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1fc00 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1fc10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fc20 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1fc30 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1fc40 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1fc50 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1fc60 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1fc70 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1fc80 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1fc90 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1fca0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1fcb0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1fcc0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1fcd0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1fce0 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1fcf0 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1fd00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd10 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1fd20 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1fd30 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1fd40 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1fd50 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1fd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1fd70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1fd80 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1fd90 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1fda0 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1fdb0 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1fdc0 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1fdd0 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1fde0 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1fdf0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1fe00 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1fe10 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1fe20 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1fe30 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1fe40 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1fe50 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1fe60 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1fe70 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1fe80 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1fe90 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1fea0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1feb0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1fec0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1fed0 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1fee0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1fef0 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1ff00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1ff10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1ff20 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1ff30 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1ff40 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1ff50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1ff60 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1ff70 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1ff80 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1ff90 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1ffa0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1ffb0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1ffc0 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1ffd0 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1ffe0 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1fff0 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
20000 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
20010 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
20020 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
20030 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
20040 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
20050 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
20060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20070 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
20080 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
20090 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
200a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
200b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
200c0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
200d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
200e0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
200f0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
20100 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
20110 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
20120 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
20130 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20140 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
20150 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
20160 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
20170 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20180 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20190 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
201a0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
201b0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
201c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
201d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
201e0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
201f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20200 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
20210 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
20220 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
20230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
20240 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
20250 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
20260 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
20270 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
20280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20290 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
202a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
202b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
202c0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
202d0 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
202e0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
202f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
20310 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
20320 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
20330 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
20340 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
20350 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
20360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20370 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
20380 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
20390 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
203a0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
203b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
203c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
203d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
203e0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
203f0 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
20400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
20410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
20420 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
20430 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
20440 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
20450 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
20460 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
20470 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
20480 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20490 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
204a0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
204b0 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
204c0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
204d0 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
204e0 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
204f0 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
20500 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
20510 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
20520 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
20530 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
20540 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
20550 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
20560 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
20570 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
20580 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
20590 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
205a0 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
205b0 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
205c0 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
205d0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
205e0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
205f0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
20600 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
20610 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
20620 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
20630 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20640 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
20650 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
20660 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
20670 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20680 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
20690 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
206a0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
206b0 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
206c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
206d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
206e0 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
206f0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
20700 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
20710 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
20720 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
20730 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
20740 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20750 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20760 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20770 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20780 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20790 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
207a0 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
207b0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
207c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
207d0 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
207e0 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
207f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20800 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20810 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20820 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20830 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20840 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20850 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
20860 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
20870 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
20880 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
20890 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
208a0 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
208b0 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
208c0 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
208d0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
208e0 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
208f0 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
20900 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
20910 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
20920 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
20930 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
20940 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
20950 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
20960 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
20970 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
20980 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
20990 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
209a0 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
209b0 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
209c0 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
209d0 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
209e0 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
209f0 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
20a00 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
20a10 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
20a20 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
20a30 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
20a40 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
20a50 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20a60 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
20a70 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
20a80 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
20a90 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
20aa0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
20ab0 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
20ac0 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
20ad0 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
20ae0 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
20af0 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
20b00 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
20b10 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
20b20 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
20b30 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
20b40 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
20b50 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
20b60 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
20b70 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20b80 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
20b90 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
20ba0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
20bb0 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
20bc0 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
20bd0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
20be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20bf0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20c00 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
20c10 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
20c20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
20c30 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
20c40 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
20c50 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
20c60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
20c70 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
20c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20c90 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
20ca0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
20cb0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
20cc0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
20cd0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
20ce0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
20cf0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
20d00 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20d10 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
20d20 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
20d30 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
20d40 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
20d50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20d60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20d70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
20d90 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
20da0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
20db0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
20dc0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
20dd0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
20de0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
20df0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
20e00 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
20e10 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
20e20 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20e30 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20e40 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20e50 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20e60 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20e70 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20e80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
20e90 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
20ea0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
20eb0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
20ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20ed0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
20ee0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
20ef0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
20f00 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
20f10 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
20f20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20f30 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
20f40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20f50 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20f60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20f70 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20f80 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
20f90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20fa0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
20fb0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
20fc0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20fd0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
20fe0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20ff0 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
21000 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21010 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
21020 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
21030 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21040 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
21050 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
21060 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
21070 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
21080 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
21090 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
210a0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
210b0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
210c0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
210d0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
210e0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
210f0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
21100 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
21110 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
21120 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
21130 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
21140 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
21150 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
21160 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
21170 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
21180 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
21190 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
211a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
211b0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
211c0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
211d0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
211e0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
211f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
21200 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
21210 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
21220 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
21230 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
21240 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
21250 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
21260 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21270 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21280 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
21290 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
212a0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
212b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
212c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
212d0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
212e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
212f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
21300 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
21310 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
21320 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21330 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21340 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
21350 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
21360 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
21370 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
21380 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
21390 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
213a0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
213b0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
213c0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
213d0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
213e0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
213f0 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
21400 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
21410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21420 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21430 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
21440 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21450 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21460 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
21470 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
21480 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
21490 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
214a0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
214b0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
214c0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
214d0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
214e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
214f0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21500 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
21510 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
21520 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21530 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21540 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21550 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
21560 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
21570 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
21580 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
21590 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
215a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
215b0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
215c0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
215d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
215e0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
215f0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
21600 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21610 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21620 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21630 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
21640 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
21650 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
21660 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
21670 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
21680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21690 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
216a0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
216b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
216c0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
216d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
216e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
216f0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21700 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21710 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21720 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21740 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
21750 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
21760 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
21770 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
21780 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
21790 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
217a0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
217b0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
217c0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
217d0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
217e0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
217f0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
21800 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
21810 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21820 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
21830 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
21840 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
21850 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21860 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
21870 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21880 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21890 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
218a0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
218b0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
218c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
218d0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
218e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
218f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21900 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
21910 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
21920 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
21930 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
21940 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
21950 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
21960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21970 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
21980 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
21990 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
219a0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
219b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
219c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
219d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
219e0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
219f0 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
21a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21a10 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21a20 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
21a30 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
21a40 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
21a50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21a60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
21a70 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
21a80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
21a90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
21aa0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
21ab0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
21ac0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
21ad0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
21ae0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21af0 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
21b00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21b10 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
21b20 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
21b30 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
21b40 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
21b50 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c  /*.** Invoke SQL
21b60 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
21b70 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65  IZE based on the
21b80 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
21b90 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61  f szMmap..*/.sta
21ba0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69  tic void pagerFi
21bb0 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20  xMaplimit(Pager 
21bc0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51  *pPager){.#if SQ
21bd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
21be0 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66  ZE>0.  sqlite3_f
21bf0 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72  ile *fd = pPager
21c00 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70  ->fd;.  if( isOp
21c10 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d  en(fd) && fd->pM
21c20 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
21c30 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=3 ){.    sqlit
21c40 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20  e3_int64 sz;.   
21c50 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a   sz = pPager->sz
21c60 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72  Mmap;.    pPager
21c70 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73  ->bUseFetch = (s
21c80 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  z>0);.    sqlite
21c90 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
21ca0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
21cb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
21cc0 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d  _SIZE, &sz);.  }
21cd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
21ce0 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
21cf0 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
21d00 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
21d10 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ade of the datab
21d20 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  ase file..*/.voi
21d30 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21d40 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72  tMmapLimit(Pager
21d50 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65   *pPager, sqlite
21d60 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
21d70 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  .  pPager->szMma
21d80 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61  p = szMmap;.  pa
21d90 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70  gerFixMaplimit(p
21da0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
21db0 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   Free as much me
21dc0 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
21dd0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
21de0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21df0 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65  PagerShrink(Page
21e00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
21e10 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e  lite3PcacheShrin
21e20 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  k(pPager->pPCach
21e30 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
21e40 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20  ust settings of 
21e50 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f  the pager to tho
21e60 73 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  se specified in 
21e70 74 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61  the pgFlags para
21e80 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
21e90 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c   "level" in pgFl
21ea0 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
21eb0 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74  HRONOUS_MASK set
21ec0 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  s the robustness
21ed0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
21ee0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
21ef0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
21f00 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
21f10 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67  s by.** changing
21f20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
21f30 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
21f40 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
21f50 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  s..** There are 
21f60 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
21f70 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
21f80 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
21f90 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
21fa0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
21fb0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
21fc0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
21fd0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
21fe0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
21ff0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
22000 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
22010 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
22020 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
22030 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22040 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
22050 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
22060 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
22070 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
22080 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
22090 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
220a0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
220b0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
220c0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
220d0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
220e0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
220f0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
22100 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
22110 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
22120 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
22130 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
22140 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
22150 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
22160 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
22170 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
22180 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
22190 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
221a0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
221b0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
221c0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
221d0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
221e0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
221f0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
22200 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
22210 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
22220 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
22230 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
22240 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
22250 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22260 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
22270 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
22280 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
22290 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
222a0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
222b0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
222c0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
222d0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
222e0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
222f0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
22300 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
22310 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22320 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
22330 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
22340 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
22350 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
22360 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
22370 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
22380 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
22390 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
223a0 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
223b0 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
223c0 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
223d0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
223e0 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
223f0 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
22400 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
22410 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
22420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22430 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
22440 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
22450 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
22460 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
22470 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
22480 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
22490 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
224a0 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
224b0 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
224c0 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
224d0 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
224e0 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
224f0 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
22500 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
22510 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
22520 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
22530 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
22540 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
22550 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
22560 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
22570 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a  ith NORMAL..**.*
22580 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
22590 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
225a0 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
225b0 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
225c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
225d0 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
225e0 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
225f0 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
22600 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
22610 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
22620 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22630 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
22640 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
22650 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
22660 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
22670 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
22680 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
22690 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
226a0 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
226b0 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
226c0 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
226d0 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
226e0 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
226f0 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
22700 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
22710 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
22720 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
22730 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
22740 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
22750 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
22760 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
22770 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22780 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
22790 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
227a0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
227b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
227c0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
227d0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
227e0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20  PagerSetFlags(. 
227f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22810 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74  ger to set safet
22820 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20  y level for */. 
22830 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
22840 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  s      /* Variou
22850 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  s flags */.){.  
22860 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d  unsigned level =
22870 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22880 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
22890 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  K;.  assert( lev
228a0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
228b0 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
228c0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
228d0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
228e0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
228f0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
22900 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
22910 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
22920 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
22930 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
22940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22950 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
22960 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22970 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
22980 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
22990 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43   PAGER_FULLFSYNC
229a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
229b0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
229c0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
229d0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
229e0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
229f0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
22a00 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
22a10 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  & PAGER_CKPT_FUL
22a20 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
22a30 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22a40 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22a50 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22a60 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22a70 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22a80 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
22a90 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22aa0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22ab0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
22ac0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22ad0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22ae0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
22af0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
22b00 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
22b10 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  ncFlags;.  if( p
22b20 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22b30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
22b40 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57  alSyncFlags |= W
22b50 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
22b60 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IONS;.  }.  if( 
22b70 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22b80 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20  CACHESPILL ){.  
22b90 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
22ba0 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
22bb0 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b  AG_OFF;.  }else{
22bc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
22bd0 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
22be0 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a  FLAG_OFF;.  }.}.
22bf0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
22c00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
22c10 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
22c20 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
22c30 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
22c40 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
22c50 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
22c60 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
22c70 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
22c80 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
22c90 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
22ca0 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
22cb0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
22cc0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
22cd0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
22ce0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
22cf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
22d00 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
22d10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
22d20 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
22d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
22d40 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
22d50 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
22d60 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
22d70 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
22d80 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
22d90 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
22da0 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
22db0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
22dc0 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
22dd0 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
22de0 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
22df0 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
22e00 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
22e10 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
22e20 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
22e30 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
22e40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22e50 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
22e60 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
22e70 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22e80 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
22e90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22ea0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
22eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
22ec0 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
22ed0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
22ee0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
22ef0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
22f00 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
22f10 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
22f20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
22f30 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
22f40 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
22f50 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
22f60 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
22f70 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
22f80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
22f90 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
22fa0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
22fb0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
22fc0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
22fd0 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
22fe0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22ff0 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
23000 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
23010 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
23020 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
23030 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
23040 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
23050 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
23060 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
23070 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
23080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23090 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
230a0 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
230b0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
230c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
230d0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
230e0 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
230f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
23100 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
23110 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
23120 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
23130 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
23140 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
23150 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
23160 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
23170 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
23180 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
23190 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
231a0 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
231b0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
231c0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
231d0 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
231e0 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
231f0 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
23200 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
23210 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
23220 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
23230 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
23240 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
23250 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
23260 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
23270 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
23280 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
23290 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
232a0 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
232b0 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
232e0 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
232f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23320 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
23330 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
23340 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
23350 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
23360 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
23370 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
23380 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
23390 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
233a0 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
233b0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
233c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
233d0 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
233e0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
233f0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
23400 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
23410 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
23420 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
23430 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
23440 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
23450 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
23460 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
23470 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
23480 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
23490 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
234a0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
234b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
234e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
234f0 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
23500 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
23510 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
23520 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
23530 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
23540 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23560 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
23570 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
23580 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  er */.){.  pPage
23590 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
235a0 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
235b0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
235c0 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
235d0 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20  yHandlerArg;..  
235e0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
235f0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f  r->fd) ){.    vo
23600 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20  id **ap = (void 
23610 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73  **)&pPager->xBus
23620 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73  yHandler;.    as
23630 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76  sert( ((int(*)(v
23640 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d  oid *))(ap[0]))=
23650 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b  =xBusyHandler );
23660 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b  .    assert( ap[
23670 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72  1]==pBusyHandler
23680 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Arg );.    sqlit
23690 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
236a0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
236b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53  SQLITE_FCNTL_BUS
236c0 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20  YHANDLER, (void 
236d0 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  *)ap);.  }.}../*
236e0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
236f0 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
23700 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
23710 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
23720 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
23730 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
23740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
23750 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
23760 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
23770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23780 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
23790 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
237a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
237b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
237c0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
237d0 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
237e0 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51  ITE_IOERR, an SQ
237f0 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73  LITE_IOERR_xxx s
23800 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54  ub-code or SQLIT
23810 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
23820 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
23830 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
23840 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
23850 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
23860 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
23870 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
23880 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
23890 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
238a0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
238b0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
238c0 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
238d0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
238e0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
238f0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
23900 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
23910 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
23920 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
23930 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
23940 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
23950 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
23960 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
23970 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
23980 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
23990 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
239a0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
239b0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
239c0 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
239d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
239e0 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
239f0 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
23a00 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
23a10 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
23a20 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
23a30 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
23a40 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
23a50 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
23a60 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
23a70 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
23a80 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23a90 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
23aa0 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
23ab0 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
23ac0 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
23ad0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
23ae0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23af0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
23b00 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
23b10 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
23b20 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
23b30 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
23b40 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
23b50 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
23b60 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
23b70 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
23b80 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
23b90 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
23ba0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
23bb0 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
23bc0 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
23bd0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
23be0 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
23bf0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
23c00 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
23c10 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
23c20 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
23c30 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67  Pager, u32 *pPag
23c40 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
23c50 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
23c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
23c70 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
23c80 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c  ible to do a ful
23c90 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  l assert_pager_s
23ca0 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20  tate() here, as 
23cb0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
23cc0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
23cd0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67   from within Pag
23ce0 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65  erOpen(), before
23cf0 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
23d00 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
23d10 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  ect is internall
23d20 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  y consistent..  
23d30 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70  **.  ** At one p
23d40 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69  oint this functi
23d50 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
23d60 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  rror if the page
23d70 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50  r was in .  ** P
23d80 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
23d90 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45  . But since PAGE
23da0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75  R_ERROR state gu
23db0 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20  arantees that.  
23dc0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c  ** there is at l
23dd0 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
23de0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
23df0 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nce, this functi
23e00 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  on.  ** is a no-
23e10 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65  op for that case
23e20 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20   anyhow..  */.. 
23e30 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20   u32 pageSize = 
23e40 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  *pPageSize;.  as
23e50 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
23e60 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
23e70 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
23e80 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
23e90 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20  _SIZE) );.  if( 
23ea0 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
23eb0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
23ec0 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71  ize==0).   && sq
23ed0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
23ee0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
23ef0 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70  che)==0 .   && p
23f00 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
23f10 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72  ize!=(u32)pPager
23f20 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b  ->pageSize .  ){
23f30 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
23f40 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
23f50 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20      /* New temp 
23f60 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34  space */.    i64
23f70 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20   nByte = 0;..   
23f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
23f90 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26  ate>PAGER_OPEN &
23fa0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
23fb0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63  >fd) ){.      rc
23fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
23fd0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
23fe0 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a   &nByte);.    }.
23ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
24010 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
24020 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
24030 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
24040 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20   if( !pNew ) rc 
24050 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
24060 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
24070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24080 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
24090 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
240a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
240b0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
240c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
240d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
240e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
240f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24100 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
24110 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24120 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
24130 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
24140 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
24150 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
24160 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
24170 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
24180 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
24190 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
241a0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
241b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
241c0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
241d0 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
241e0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
241f0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
24200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24210 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
24220 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
24230 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
24240 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
24250 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
24260 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
24270 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
24280 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
24290 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
242a0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
242b0 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
242c0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
242d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
242e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
242f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
24300 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
24310 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
24320 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
24330 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
24340 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
24350 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
24360 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
24370 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
24380 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
24390 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
243a0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
243b0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
243c0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
243d0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
243e0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
243f0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
24400 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
24410 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
24420 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
24430 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
24440 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
24450 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
24460 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
24470 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
24480 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
24490 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
244a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
244b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
244c0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
244d0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
244e0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
244f0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
24500 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
24510 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
24520 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
24530 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
24540 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
24550 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
24560 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24570 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
24580 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
24590 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
245a0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
245b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
245c0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
245d0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
245e0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
245f0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
24600 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
24610 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
24620 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24630 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
24640 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
24650 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
24660 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
24670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24680 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
24690 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
246a0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
246b0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
246c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
246d0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
246e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
246f0 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
24700 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
24710 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
24720 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
24730 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
24740 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24750 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
24760 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
24770 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
24780 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
24790 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
247a0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
247b0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
247c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
247d0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
247e0 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
247f0 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
24800 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
24810 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
24820 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24830 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24840 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
24850 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
24860 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
24870 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24880 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
24890 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
248a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
248b0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
248c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
248d0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
248e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
248f0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
24900 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
24910 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
24920 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
24930 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
24940 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24950 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
24960 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
24970 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
24980 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
24990 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
249a0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
249b0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
249c0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
249d0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
249e0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
249f0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24a00 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
24a10 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
24a20 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
24a30 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
24a40 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
24a50 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
24a60 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
24a70 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
24a80 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24a90 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
24aa0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
24ab0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
24ac0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24ad0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
24ae0 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
24af0 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
24b00 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
24b10 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
24b20 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
24b30 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
24b40 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
24b50 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
24b60 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
24b70 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
24b80 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
24b90 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
24ba0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
24bb0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
24bc0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
24bd0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
24be0 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
24bf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24c00 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
24c10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24c20 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
24c30 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
24c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24c50 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
24c60 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
24c70 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
24c80 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
24c90 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
24ca0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
24cb0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
24cc0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
24cd0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
24ce0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
24cf0 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
24d00 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
24d10 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
24d20 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
24d30 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
24d40 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
24d50 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
24d60 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
24d70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24d80 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
24d90 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
24da0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
24db0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
24dc0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
24dd0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
24de0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24df0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
24e00 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
24e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24e20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24e30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24e40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
24e50 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
24e60 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
24e70 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
24e80 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
24e90 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
24ea0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
24eb0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
24ec0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
24ed0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
24ee0 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
24ef0 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
24f00 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
24f10 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
24f20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
24f30 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
24f40 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
24f50 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
24f60 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
24f70 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
24f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
24f90 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
24fa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24fb0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
24fc0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
24fd0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
24fe0 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
24ff0 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
25000 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
25010 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
25020 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
25030 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
25040 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
25050 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
25060 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
25070 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
25080 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
25090 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
250a0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
250b0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
250c0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
250d0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
250e0 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
250f0 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
25100 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
25110 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
25120 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
25130 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
25140 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
25150 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
25160 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
25170 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
25180 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
25190 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
251a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
251b0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
251c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
251d0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
251e0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
251f0 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
25200 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
25210 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
25220 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
25230 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
25240 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25260 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
25270 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
25280 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
25290 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
252c0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
252d0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
252e0 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
252f0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
25300 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
25310 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
25320 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
25330 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
25340 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
25350 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
25360 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
25370 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
25380 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
25390 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
253a0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
253b0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
253c0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
253d0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
253e0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
253f0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
25400 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
25410 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
25420 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
25430 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
25440 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
25450 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
25460 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
25470 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
25480 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
25490 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
254a0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
254b0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
254c0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
254d0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
254e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
254f0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
25500 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25510 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25520 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
25530 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
25540 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
25550 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
25560 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
25570 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
25580 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
25590 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
255a0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
255b0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
255c0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
255d0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
255e0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
255f0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
25600 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
25610 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
25620 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
25630 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
25640 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
25650 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25660 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
25670 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
25680 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
25690 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
256a0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
256b0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
256c0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
256d0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
256e0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
256f0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
25700 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
25710 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
25720 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
25730 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
25740 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
25750 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
25760 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
25770 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
25780 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
25790 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
257a0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
257b0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
257c0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
257d0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
257e0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
257f0 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
25800 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
25810 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
25820 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25830 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
25840 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
25850 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
25860 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
25870 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25880 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
25890 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
258a0 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
258b0 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
258c0 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
258d0 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
258e0 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
258f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
25900 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
25910 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
25920 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
25930 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
25940 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
25950 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
25960 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
25970 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
25980 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25990 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
259a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
259b0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
259c0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
259d0 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
259e0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
259f0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
25a00 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
25a10 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
25a20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25a30 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
25a40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25a50 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
25a60 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
25a70 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
25a80 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25a90 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
25aa0 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
25ab0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25ac0 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
25ad0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
25ae0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
25af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
25b00 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
25b10 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
25b20 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
25b30 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
25b40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25b50 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
25b60 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
25b70 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
25b80 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
25b90 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
25ba0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
25bb0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
25bc0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
25bd0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
25be0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
25bf0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
25c00 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
25c10 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
25c20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
25c30 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
25c40 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
25c50 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
25c60 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
25c70 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
25c80 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
25c90 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
25ca0 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
25cb0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
25cc0 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
25cd0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
25ce0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
25cf0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
25d00 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
25d10 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
25d20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
25d30 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
25d40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25d50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
25d60 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
25d70 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
25d80 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
25d90 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
25da0 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
25db0 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
25dc0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25dd0 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
25de0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
25df0 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
25e00 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
25e10 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
25e20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
25e30 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
25e40 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
25e50 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
25e60 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
25e70 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
25e80 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
25e90 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
25ea0 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
25eb0 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
25ec0 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
25ed0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25ee0 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
25ef0 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
25f00 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
25f10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
25f20 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
25f30 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
25f40 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
25f50 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
25f60 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
25f70 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
25f80 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
25f90 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
25fa0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25fb0 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
25fc0 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
25fd0 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
25fe0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25ff0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26000 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26010 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
26020 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
26030 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
26040 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
26050 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
26060 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
26070 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
26080 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26090 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
260a0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
260b0 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
260c0 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
260d0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
260e0 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
260f0 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
26100 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
26110 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26120 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
26130 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
26140 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
26150 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
26160 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
26170 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
26180 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
26190 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
261a0 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
261b0 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
261c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
261d0 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
261e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
261f0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
26200 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
26210 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
26220 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
26230 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26240 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
26250 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
26260 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
26270 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
26280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
26290 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
262a0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
262b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
262c0 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
262d0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
262e0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
262f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26300 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
26310 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
26320 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
26330 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
26340 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26350 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
26360 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
26370 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
26380 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
26390 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
263a0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
263b0 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
263c0 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
263d0 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
263e0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
263f0 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
26400 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
26410 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
26420 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
26430 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
26440 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
26450 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26460 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
26470 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
26480 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
26490 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
264a0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
264b0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
264c0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
264d0 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
264e0 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
264f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26500 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
26510 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26530 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
26540 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
26550 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
26560 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
26570 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
26580 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
26590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
265a0 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
265b0 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
265c0 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
265f0 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
26600 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
26630 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
26640 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69  return */.  .  i
26650 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
26660 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
26670 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
26680 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26690 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
266a0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
266b0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
266c0 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
266d0 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78     memset(p->pEx
266e0 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  tra, 0, pPager->
266f0 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
26700 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26710 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
26720 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
26730 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
26740 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
26750 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
26760 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
26770 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
26780 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
26790 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
267a0 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
267b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
267c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
267d0 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76    p->pExtra = (v
267e0 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  oid *)&p[1];.   
267f0 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44   p->flags = PGHD
26800 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e  R_MMAP;.    p->n
26810 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e  Ref = 1;.    p->
26820 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
26830 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
26840 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64  p->pExtra==(void
26850 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73   *)&p[1] );.  as
26860 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d  sert( p->pPage==
26870 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26880 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d  ->flags==PGHDR_M
26890 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MAP );.  assert(
268a0 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67   p->pPager==pPag
268b0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
268c0 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20  p->nRef==1 );.. 
268d0 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b   p->pgno = pgno;
268e0 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44  .  p->pData = pD
268f0 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ata;.  pPager->n
26900 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65  MmapOut++;..  re
26910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26920 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
26930 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26940 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75  page pPg. pPg mu
26950 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74  st have been ret
26960 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20  urned by an .** 
26970 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
26980 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26990 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
269a0 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61   void pagerRelea
269b0 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20  seMapPage(PgHdr 
269c0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
269d0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
269e0 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ager;.  pPager->
269f0 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50  nMmapOut--;.  pP
26a00 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
26a10 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26a20 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  t;.  pPager->pMm
26a30 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67  apFreelist = pPg
26a40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
26a50 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
26a60 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
26a70 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ;.  sqlite3OsUnf
26a80 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
26a90 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f   (i64)(pPg->pgno
26aa0 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
26ab0 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61  Size, pPg->pData
26ac0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
26ad0 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63   all PgHdr objec
26ae0 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ts stored in the
26af0 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65   Pager.pMmapFree
26b00 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  list list..*/.st
26b10 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
26b20 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72  reeMapHdrs(Pager
26b30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
26b40 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a  dr *p;.  PgHdr *
26b50 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
26b60 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26b70 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74  list; p; p=pNext
26b80 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
26b90 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71  ->pDirty;.    sq
26ba0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
26bb0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75   }.}.../*.** Shu
26bc0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
26bd0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
26be0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
26bf0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
26c00 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
26c10 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
26c20 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
26c30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
26c40 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
26c50 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
26c60 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
26c70 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
26c80 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
26c90 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
26ca0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
26cb0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
26cc0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
26cd0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
26ce0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
26cf0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
26d00 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
26d10 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
26d20 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
26d30 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
26d40 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
26d50 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
26d60 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
26d70 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
26d80 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
26d90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
26da0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
26db0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
26dc0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
26dd0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
26de0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
26df0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
26e00 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
26e10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
26e20 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
26e30 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
26e40 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
26e50 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
26e60 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
26e70 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
26e80 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62  ager) );.  disab
26e90 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
26ea0 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
26eb0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
26ec0 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46  lloc();.  pagerF
26ed0 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65  reeMapHdrs(pPage
26ee0 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  r);.  /* pPager-
26ef0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f  >errCode = 0; */
26f00 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
26f10 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69  siveMode = 0;.#i
26f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26f30 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57  T_WAL.  sqlite3W
26f40 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  alClose(pPager->
26f50 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b  pWal, pPager->ck
26f60 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61  ptSyncFlags, pPa
26f70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26f80 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Tmp);.  pPager->
26f90 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pWal = 0;.#endif
26fa0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
26fb0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
26fc0 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
26fd0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
26fe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26ff0 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20   If it is open, 
27000 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
27010 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
27020 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  ling UnlockAndRo
27030 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49  llback..    ** I
27040 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f  f this is not do
27050 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79  ne, then an unsy
27060 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
27070 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
27080 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61   .    ** file ma
27090 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  y be played back
270a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
270b0 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
270c0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20  ailure occurs . 
270d0 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73     ** while this
270e0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
270f0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
27100 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
27110 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
27120 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
27130 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
27140 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
27150 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70  nal, shift the p
27160 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ager.    ** into
27170 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
27180 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e  . This causes Un
27190 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20  lockAndRollback 
271a0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20  to unlock the.  
271b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e    ** database an
271c0 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  d close the jour
271d0 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74  nal file without
271e0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
271f0 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61  oll it.    ** ba
27200 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69  ck or finalize i
27210 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61  t. The next data
27220 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68  base user will h
27230 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f  ave to do hot-jo
27240 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c  urnal.    ** rol
27250 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63  lback before acc
27260 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
27270 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
27280 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
27290 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
272a0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
272b0 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
272c0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
272d0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
272e0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
272f0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
27300 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
27310 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
27320 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
27330 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27340 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
27350 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
27360 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
27370 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
27380 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
27390 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  )).  sqlite3OsCl
273a0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
273b0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
273c0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
273d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
273e0 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
273f0 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
27400 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
27410 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
27420 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
27430 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
27440 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
27450 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
27460 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
27470 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27480 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
27490 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
274a0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
274b0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
274c0 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
274d0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
274e0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
274f0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
27500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27510 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
27520 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
27530 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
27540 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27550 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
27560 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
27570 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
27580 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
27590 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
275a0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
275b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
275c0 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
275d0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
275e0 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
275f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
27600 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27610 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
27620 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
27630 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
27640 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
27650 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
27660 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
27670 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
27680 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
27690 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
276a0 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
276b0 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
276c0 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
276d0 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
276e0 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
276f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
27700 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
27710 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
27720 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
27730 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
27740 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
27750 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
27760 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
27770 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
27780 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
27790 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
277a0 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69  istics of the fi
277b0 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
277c0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
277d0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
277e0 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
277f0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
27800 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
27810 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
27820 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
27830 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
27840 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
27850 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
27860 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
27870 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
27880 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
27890 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
278a0 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
278b0 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
278c0 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
278d0 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
278e0 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
278f0 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
27900 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
27910 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
27920 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
27930 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
27940 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
27950 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
27960 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
27970 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
27980 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
27990 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
279a0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
279b0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
279c0 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
279d0 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
279e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
279f0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
27a00 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
27a10 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
27a20 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
27a30 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
27a40 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
27a50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
27a60 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
27a70 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
27a80 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
27a90 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
27aa0 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
27ab0 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
27ac0 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
27ad0 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
27ae0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
27af0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27b00 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
27b10 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
27b20 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
27b30 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
27b40 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
27b50 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
27b60 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
27b70 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
27b80 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
27b90 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
27ba0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
27bb0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
27bc0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
27bd0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
27be0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
27bf0 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
27c00 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
27c30 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
27c40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
27c50 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
27c60 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
27c70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
27c80 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
27c90 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
27ca0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27cb0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
27cc0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
27cd0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
27ce0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
27cf0 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
27d00 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
27d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27d20 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
27d30 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27d40 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
27d50 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
27d60 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
27d70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27d80 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
27d90 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
27da0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
27db0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
27dc0 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
27dd0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
27de0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
27df0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
27e00 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
27e10 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
27e20 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
27e30 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
27e40 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
27e50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
27e60 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
27e70 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
27e80 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
27e90 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
27ea0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
27eb0 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
27ec0 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
27ed0 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
27ee0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
27ef0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
27f00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
27f10 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
27f20 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
27f30 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
27f40 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
27f50 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
27f60 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
27f70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
27f80 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
27f90 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
27fa0 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
27fb0 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
27fc0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
27fd0 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
27fe0 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
27ff0 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
28000 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
28010 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
28020 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
28030 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
28040 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
28050 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
28060 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
28070 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
28080 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
28090 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
280a0 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
280b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
280c0 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
280d0 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
280e0 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
280f0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
28100 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
28110 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
28120 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
28130 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
28140 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
28150 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
28160 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
28170 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
28180 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
28190 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
281a0 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
281b0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
281c0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
281d0 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
281e0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
281f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
28200 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
28210 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
28220 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
28230 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
28240 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
28250 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
28260 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
28270 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
28280 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
28290 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
282a0 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
282b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
282c0 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
282d0 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
282e0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
282f0 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
28300 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
28310 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
28320 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
28330 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
28340 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
28350 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
28360 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
28370 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
28380 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
28390 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
283a0 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
283b0 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
283c0 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
283d0 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
283e0 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
283f0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
28400 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
28410 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
28420 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
28430 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
28440 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
28450 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
28460 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
28470 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
28480 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
28490 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
284a0 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
284b0 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
284c0 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
284d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
284e0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
284f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
28500 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
28510 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
28520 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28530 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
28540 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
28550 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
28560 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
28570 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
28580 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
28590 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
285a0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
285b0 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
285c0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
285d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
285e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
285f0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
28600 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
28610 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
28620 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28630 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
28640 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
28650 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
28660 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
28670 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
28680 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
28690 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
286a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
286b0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
286c0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
286d0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
286e0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
286f0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
28700 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
28710 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
28720 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
28730 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
28740 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28750 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
28760 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
28770 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
28780 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
28790 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
287a0 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
287b0 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
287c0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
287d0 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
287e0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
287f0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
28800 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
28810 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
28820 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
28830 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
28840 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
28850 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
28860 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
28870 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
28880 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
28890 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
288a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
288b0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
288c0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
288d0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
288e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
288f0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
28900 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
28910 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
28920 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
28930 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
28940 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
28950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28960 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
28970 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
28980 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
28990 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
289a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
289b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
289c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
289d0 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
289e0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
289f0 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
28a00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28a10 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
28a20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
28a30 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
28a40 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
28a50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
28a60 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28a70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28a80 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28aa0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
28ab0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
28ac0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
28ad0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
28ae0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
28af0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28b00 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
28b10 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
28b20 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
28b30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28b40 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
28b50 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
28b60 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
28b70 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
28b80 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
28b90 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
28ba0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
28bb0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
28bc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28bd0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28be0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
28bf0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28c00 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
28c10 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
28c20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
28c30 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28c40 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
28c50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
28c60 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
28c70 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
28c80 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
28c90 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
28ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28cc0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
28cd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28ce0 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
28cf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
28d00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
28d10 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
28d20 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
28d30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
28d40 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
28d50 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
28d60 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
28d70 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
28d80 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
28d90 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
28da0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
28db0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
28dc0 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
28dd0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
28de0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
28df0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
28e00 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
28e10 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
28e20 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
28e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28e40 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
28e50 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
28e60 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
28e70 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
28e80 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
28e90 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
28ea0 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
28eb0 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
28ec0 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
28ed0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
28ee0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
28ef0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28f00 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
28f10 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
28f20 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
28f30 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
28f40 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
28f50 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
28f60 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
28f70 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
28f80 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
28f90 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
28fa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
28fb0 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
28fc0 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
28fd0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
28fe0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
28ff0 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
29000 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
29010 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
29020 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
29030 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
29040 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
29050 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
29060 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
29070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29080 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
29090 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
290a0 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
290b0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
290c0 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
290d0 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
290e0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
290f0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
29100 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
29110 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
29120 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
29130 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
29140 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
29150 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
29160 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
29170 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
29180 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
29190 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
291a0 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
291b0 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
291c0 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
291d0 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
291e0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
291f0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
29200 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
29210 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
29220 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
29230 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
29240 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
29250 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
29260 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
29270 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
29280 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
29290 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
292a0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
292b0 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
292c0 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
292d0 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
292e0 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
292f0 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
29300 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
29310 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
29320 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
29330 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
29340 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
29350 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
29360 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
29370 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
29380 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
29390 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
293a0 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
293b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
293c0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
293d0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
293e0 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
293f0 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
29400 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
29410 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29420 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29430 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
29440 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
29450 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
29460 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
29470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29480 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
29490 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
294a0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
294b0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
294c0 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
294d0 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
294e0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
294f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
29500 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29510 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
29520 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
29530 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29540 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
29550 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
29560 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
29570 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
29580 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
29590 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
295a0 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
295b0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
295c0 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
295d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
295e0 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
295f0 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
29600 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
29610 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
29620 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
29630 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
29640 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
29650 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29660 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
29670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
29680 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
29690 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
296a0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
296b0 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
296c0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
296d0 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
296e0 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
296f0 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
29700 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
29710 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
29720 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
29730 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
29740 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29750 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
29760 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70  LITE_OK .   && p
29770 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29780 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
29790 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
297a0 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e  Dirty || pList->
297b0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48  pgno>pPager->dbH
297c0 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20  intSize).  ){.  
297d0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
297e0 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
297f0 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
29800 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
29810 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
29820 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
29830 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
29840 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
29850 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
29860 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
29870 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
29880 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29890 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
298a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
298b0 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
298c0 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
298d0 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
298e0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
298f0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
29900 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
29910 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
29920 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
29930 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
29940 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
29950 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
29960 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
29970 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
29980 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
29990 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
299a0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
299b0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
299c0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
299d0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
299e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
299f0 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
29a00 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
29a10 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
29a20 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
29a30 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
29a40 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
29a50 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
29a60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
29a70 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
29a80 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
29a90 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
29aa0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
29ab0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
29ac0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
29ad0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
29ae0 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
29af0 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
29b00 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
29b30 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
29b40 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
29b50 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
29b60 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
29b70 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
29b80 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
29b90 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
29ba0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
29bb0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
29bc0 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
29bd0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
29be0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
29bf0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
29c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29c10 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
29c20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
29c30 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
29c40 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
29c50 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
29c60 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
29c70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29c80 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
29c90 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
29ca0 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
29cb0 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
29cc0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
29cd0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
29ce0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
29cf0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
29d00 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
29d10 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
29d20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
29d30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29d40 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
29d50 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
29d60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
29d70 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
29d80 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
29d90 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
29da0 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
29db0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
29dc0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
29dd0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
29de0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
29df0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
29e00 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
29e10 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
29e20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
29e30 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
29e40 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  TE]++;..      /*
29e50 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
29e60 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
29e70 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
29e80 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
29e90 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
29ea0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
29eb0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
29ec0 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
29ed0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
29ee0 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
29ef0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
29f00 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
29f20 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29f30 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
29f40 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
29f50 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
29f60 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
29f70 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
29f80 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
29f90 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
29fa0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
29fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
29fc0 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
29fd0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
29fe0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
29ff0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
2a000 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
2a010 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
2a020 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
2a030 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
2a040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a050 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
2a060 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
2a070 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
2a080 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
2a090 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
2a0a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2a0b0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
2a0c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2a0d0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
2a0e0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
2a0f0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
2a100 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
2a110 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2a120 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
2a130 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
2a140 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
2a150 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
2a160 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
2a170 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2a180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a190 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2a1a0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2a1b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2a1c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2a1d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2a1e0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
2a1f0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2a200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
2a210 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
2a220 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
2a230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2a240 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
2a250 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2a260 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
2a270 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
2a280 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2a2a0 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
2a2b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2a2c0 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
2a2d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2a2e0 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  al. .**.** If su
2a2f0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
2a300 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
2a310 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
2a320 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
2a330 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
2a340 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
2a350 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2a360 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2a370 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2a380 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2a390 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2a3a0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
2a3b0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
2a3c0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
2a3d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2a3e0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
2a3f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2a400 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
2a410 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
2a420 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
2a430 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
2a440 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2a450 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
2a460 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
2a470 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
2a480 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2a490 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
2a4a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2a4b0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2a4c0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
2a4d0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2a4e0 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2a4f0 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
2a500 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
2a510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a520 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2a530 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2a540 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2a550 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
2a560 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2a570 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a580 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
2a590 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
2a5a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2a5b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2a5c0 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
2a5d0 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
2a5e0 28 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20  (pPager, pPg) . 
2a5f0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e          || pPg->
2a600 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
2a610 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a  rigSize .    );.
2a620 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
2a630 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2a640 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2a650 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  sub-journal was 
2a660 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75  opened successfu
2a670 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65  lly (or was alre
2a680 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a  ady open),.    *
2a690 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  * write the jour
2a6a0 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  nal record into 
2a6b0 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  the file.  */.  
2a6c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a6d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  _OK ){.      voi
2a6e0 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
2a6f0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34  pData;.      i64
2a700 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
2a710 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
2a720 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
2a730 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
2a740 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20  *pData2;.  .    
2a750 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2a760 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2a770 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2a780 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
2a790 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  2);.      PAGERT
2a7a0 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
2a7b0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
2a7c0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2a7d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2a7e0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
2a7f0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
2a800 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
2a810 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2a820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a830 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2a840 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2a850 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
2a860 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
2a870 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
2a880 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
2a890 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
2a8a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a8b0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2a8c0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2a8d0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2a8e0 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
2a8f0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
2a900 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
2a910 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
2a920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2a930 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
2a940 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2a950 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
2a960 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2a970 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
2a980 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72    return subjour
2a990 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2a9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2a9b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2a9c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2a9d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2a9e0 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
2a9f0 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
2aa00 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
2aa10 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
2aa20 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
2aa30 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
2aa40 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
2aa50 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
2aa60 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
2aa70 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
2aa80 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
2aa90 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
2aaa0 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
2aab0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2aac0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2aad0 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
2aae0 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
2aaf0 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
2ab00 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2ab10 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
2ab20 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
2ab30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2ab40 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
2ab50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2ab60 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
2ab70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
2ab80 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2ab90 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
2aba0 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
2abb0 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2abc0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2abd0 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
2abe0 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
2abf0 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
2ac00 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2ac10 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
2ac20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
2ac30 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2ac40 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
2ac50 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
2ac60 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2ac70 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2ac80 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2ac90 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
2aca0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
2acb0 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
2acc0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2acd0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
2ace0 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
2acf0 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
2ad00 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
2ad10 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
2ad20 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2ad30 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2ad40 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
2ad50 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2ad60 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
2ad70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
2ad80 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
2ad90 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2ada0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
2adb0 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
2adc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2add0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2ade0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2adf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2ae00 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2ae10 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
2ae20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
2ae30 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72  C bit is set dur
2ae40 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
2ae50 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
2ae60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
2ae70 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
2ae80 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
2ae90 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
2aea0 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
2aeb0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
2aec0 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
2aed0 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
2aee0 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
2aef0 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
2af00 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
2af10 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
2af20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52  The doNotSpill R
2af30 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20  OLLBACK and OFF 
2af40 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c  bits inhibits al
2af50 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
2af60 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73  .  ** regardless
2af70 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
2af80 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
2af90 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
2afa0 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  set during.  ** 
2afb0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79  a rollback or by
2afc0 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72   user request, r
2afd0 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
2afe0 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20  *.  ** Spilling 
2aff0 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74  is also prohibit
2b000 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72  ed when in an er
2b010 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20  ror state since 
2b020 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20  that could.  ** 
2b030 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
2b040 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49   corruption.   I
2b050 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
2b060 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20  plementation it 
2b070 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
2b080 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
2b090 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
2b0a0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
2b0b0 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a  reateFlag==3.  *
2b0c0 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
2b0d0 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
2b0e0 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
2b0f0 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
2b100 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
2b110 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
2b120 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
2b130 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
2b140 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
2b150 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
2b160 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
2b170 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
2b180 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
2b190 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
2b1a0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2b1b0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
2b1c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63  LITE_OK;.  testc
2b1d0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b1e0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b1f0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  LAG_ROLLBACK );.
2b200 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2b210 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b220 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29   SPILLFLAG_OFF )
2b230 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2b240 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b250 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53   & SPILLFLAG_NOS
2b260 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61  YNC );.  if( pPa
2b270 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a  ger->doNotSpill.
2b280 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e     && ((pPager->
2b290 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50  doNotSpill & (SP
2b2a0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2b2b0 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29  |SPILLFLAG_OFF))
2b2c0 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  !=0.      || (pP
2b2d0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2b2e0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a  _NEED_SYNC)!=0).
2b2f0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2b300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2b310 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
2b320 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
2b330 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2b340 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
2b350 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
2b360 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
2b370 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
2b380 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2b390 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b  IfRequired(pPg);
2b3a0 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
2b3b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b3c0 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2b3d0 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
2b3e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2b3f0 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
2b400 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2b410 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
2b420 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2b430 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2b440 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
2b450 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2b460 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2b470 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
2b480 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
2b490 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2b4a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
2b4b0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2b4c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2b4d0 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2b4e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2b4f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b510 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2b520 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2b530 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2b540 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2b550 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2b560 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2b570 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2b580 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2b590 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2b5a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2b5b0 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2b5c0 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2b5d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b5e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2b5f0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2b600 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2b610 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2b620 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2b630 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  , rc); .}../*.**
2b640 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66   Flush all unref
2b650 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61  erenced dirty pa
2b660 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ges to disk..*/.
2b670 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b680 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61  Flush(Pager *pPa
2b690 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2b6a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2b6b0 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
2b6c0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69  {.    PgHdr *pLi
2b6d0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
2b6e0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2b6f0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2b700 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2b710 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2b720 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c  ger) );.    whil
2b730 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2b740 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2b750 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
2b760 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2b770 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2b780 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2b790 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
2b7a0 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61  tress((void*)pPa
2b7b0 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  ger, pList);.   
2b7c0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74     }.      pList
2b7d0 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = pNext;.    }.
2b7e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b7f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2b800 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2b810 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
2b820 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
2b830 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
2b840 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
2b850 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
2b860 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
2b870 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
2b880 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
2b890 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
2b8a0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
2b8b0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2b8c0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
2b8d0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2b8e0 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
2b8f0 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
2b900 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
2b910 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2b920 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
2b930 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
2b940 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
2b950 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
2b960 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
2b970 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2b980 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
2b990 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
2b9a0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
2b9b0 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
2b9c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
2b9d0 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
2b9e0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2b9f0 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
2ba00 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
2ba10 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
2ba20 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2ba30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
2ba40 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
2ba50 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
2ba60 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
2ba70 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
2ba80 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
2ba90 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
2baa0 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
2bab0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
2bac0 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
2bad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2bae0 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
2baf0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
2bb00 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
2bb10 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
2bb20 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
2bb30 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
2bb40 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
2bb50 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
2bb60 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
2bb70 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
2bb80 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c  f the PAGER_* fl
2bb90 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
2bba0 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  fsFlags paramete
2bbb0 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
2bbc0 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c  o pass to the fl
2bbd0 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  ags parameter.**
2bbe0 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20   of the xOpen() 
2bbf0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75  method of the su
2bc00 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20  pplied VFS when 
2bc10 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a  opening files. .
2bc20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
2bc30 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  er object is all
2bc40 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73  ocated and the s
2bc50 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70  pecified file op
2bc60 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73  ened .** success
2bc70 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b  fully, SQLITE_OK
2bc80 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2bc90 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f   *ppPager set to
2bca0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
2bcb0 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63   new pager objec
2bcc0 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
2bcd0 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20  ccurs, *ppPager 
2bce0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
2bcf0 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65  * and error code
2bd00 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
2bd10 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
2bd20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2bd30 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c  .** (sqlite3Mall
2bd40 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  oc() is used to 
2bd50 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29  allocate memory)
2bd60 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
2bd70 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73  N or .** various
2bd80 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65   SQLITE_IO_XXX e
2bd90 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
2bda0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
2bdb0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2bdc0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
2bdd0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
2bde0 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
2bdf0 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
2be00 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r,         /* OU
2be10 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  T: Return the Pa
2be20 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
2be30 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
2be40 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
2be50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2be60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2be70 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
2be80 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
2be90 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
2bea0 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
2beb0 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2bec0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bee0 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
2bef0 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
2bf00 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c  .  int vfsFlags,
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2bf20 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
2bf30 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
2bf40 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
2bf50 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
2bf60 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63  DbPage*) /* Func
2bf70 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61  tion to reinitia
2bf80 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b  lize pages */.){
2bf90 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
2bfa0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
2bfb0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72  ;       /* Pager
2bfc0 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63   object to alloc
2bfd0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  ate and return *
2bfe0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2bff0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
2c000 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2c010 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
2c020 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
2c030 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73  e for temp files
2c040 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72   (incl. in-memor
2c050 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e  y files) */.  in
2c060 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20  t memDb = 0;    
2c070 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c080 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
2c090 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
2c0a0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
2c0b0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
2c0c0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  e if this is a r
2c0d0 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f  ead-only file */
2c0e0 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
2c0f0 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42  leSize;     /* B
2c100 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2c110 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2c120 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  l fd */.  char *
2c130 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  zPathname = 0;  
2c140 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20     /* Full path 
2c150 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
2c160 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   */.  int nPathn
2c170 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
2c180 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c190 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a  s in zPathname *
2c1a0 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
2c1b0 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
2c1c0 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
2c1d0 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74  )==0; /* False t
2c1e0 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a  o omit journal *
2c1f0 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
2c200 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
2c210 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
2c220 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2c230 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
2c240 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44  */.  u32 szPageD
2c250 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
2c260 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2c270 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
2c280 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   size */.  const
2c290 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b   char *zUri = 0;
2c2a0 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20      /* URI args 
2c2b0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
2c2c0 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20   nUri = 0;      
2c2d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c2e0 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20  of bytes of URI 
2c2f0 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f  args at *zUri */
2c300 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2c310 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
2c320 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
2c330 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
2c340 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
2c350 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
2c360 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
2c370 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2c380 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
2c390 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
2c3a0 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
2c3b0 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
2c3c0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
2c3d0 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
2c3e0 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
2c3f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2c400 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
2c410 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
2c420 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
2c430 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
2c440 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
2c450 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
2c460 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
2c470 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
2c480 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
2c490 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
2c4a0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2c4b0 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
2c4c0 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
2c4d0 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
2c4e0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2c4f0 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
2c500 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2c510 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
2c520 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2c530 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
2c540 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
2c550 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
2c560 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2c570 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
2c580 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
2c590 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
2c5a0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
2c5b0 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
2c5c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
2c5d0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
2c5e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2c5f0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
2c600 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41    if( flags & PA
2c610 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  GER_MEMORY ){.  
2c620 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
2c630 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2c640 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2c650 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
2c660 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
2c670 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  Dup(0, zFilename
2c680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61  );.      if( zPa
2c690 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74  thname==0  ) ret
2c6a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2c6b0 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d  ;.      nPathnam
2c6c0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2c6d0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2c6e0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20        zFilename 
2c6f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
2c700 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
2c710 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
2c720 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
2c730 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
2c740 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
2c750 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
2c760 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
2c770 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
2c780 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
2c790 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
2c7a0 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
2c7b0 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
2c7c0 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
2c7d0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2c7e0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2c7f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2c800 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61   *z;.    nPathna
2c810 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
2c820 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
2c830 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c840 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
2c850 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
2c860 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2c870 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2c880 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2c890 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e      }.    zPathn
2c8a0 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
2c8b0 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
2c8c0 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
2c8d0 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
2c8e0 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
2c8f0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
2c900 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2c910 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
2c920 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2c930 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2c940 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2c950 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  hname);.    z = 
2c960 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d  zUri = &zFilenam
2c970 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
2c980 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b  0(zFilename)+1];
2c990 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
2c9a0 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  {.      z += sql
2c9b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2c9c0 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  1;.      z += sq
2c9d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2c9e0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55  +1;.    }.    nU
2c9f0 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d  ri = (int)(&z[1]
2ca00 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73   - zUri);.    as
2ca10 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b  sert( nUri>=0 );
2ca20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ca30 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
2ca40 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
2ca50 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
2ca60 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
2ca70 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
2ca80 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
2ca90 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2caa0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2cab0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
2cac0 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
2cad0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
2cae0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
2caf0 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
2cb00 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
2cb10 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
2cb20 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
2cb30 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
2cb40 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
2cb50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cb60 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
2cb70 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
2cb80 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
2cb90 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
2cba0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2cbb0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2cbc0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2cbd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cbe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2cbf0 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2cc00 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2cc10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2cc20 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2cc30 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50  memory for the P
2cc40 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
2cc50 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74  PCache object, t
2cc60 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69  he.  ** three fi
2cc70 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2cc80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cc90 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a  e name and the j
2cca0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
2ccb0 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f  e name. The layo
2ccc0 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20  ut in memory is 
2ccd0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
2cce0 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20  .  **     Pager 
2ccf0 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2cd00 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
2cd10 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a  f(Pager) bytes).
2cd20 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20    **     PCache 
2cd30 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2cd40 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2cd50 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79  3PcacheSize() by
2cd60 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2cd70 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
2cd80 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70  le            (p
2cd90 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79  Vfs->szOsFile by
2cda0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75  tes).  **     Su
2cdb0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  b-journal file h
2cdc0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a  andle         (j
2cdd0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2cde0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d  ytes).  **     M
2cdf0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
2ce00 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28   handle        (
2ce10 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2ce20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2ce30 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
2ce40 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2ce50 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74  (nPathname+1 byt
2ce60 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75  es).  **     Jou
2ce70 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20  rnal file name  
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2ce90 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65  athname+8+1 byte
2cea0 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d  s).  */.  pPtr =
2ceb0 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61   (u8 *)sqlite3Ma
2cec0 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f  llocZero(.    RO
2ced0 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2cee0 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20  ger)) +      /* 
2cef0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2cf00 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63  */.    ROUND8(pc
2cf10 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20  acheSize) +     
2cf20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
2cf30 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f  object */.    RO
2cf40 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2cf50 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  ile) +       /* 
2cf60 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
2cf70 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
2cf80 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
2cf90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
2cfa0 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
2cfb0 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  */ .    nPathnam
2cfc0 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20  e + 1 + nUri +  
2cfd0 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
2cfe0 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68  ame */.    nPath
2cff0 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20  name + 8 + 2    
2d000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f            /* zJo
2d010 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
2d020 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2d030 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65  .    + nPathname
2d040 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20   + 4 + 2        
2d050 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
2d060 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
2d070 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2d080 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
2d090 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
2d0a0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
2d0b0 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
2d0c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d0d0 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d0e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d0f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
2d100 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
2d110 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
2d120 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
2d130 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
2d140 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
2d150 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2d160 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
2d170 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
2d180 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2d190 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
2d1a0 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
2d1b0 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
2d1c0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d1d0 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2d1e0 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
2d1f0 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
2d200 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2d210 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2d220 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
2d230 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
2d240 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
2d250 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2d260 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2d270 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
2d280 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
2d290 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2d2a0 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
2d2b0 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
2d2c0 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
2d2d0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
2d2e0 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
2d2f0 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68     assert( nPath
2d300 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50  name>0 );.    pP
2d310 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
2d320 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2d330 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
2d340 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65   + nUri);.    me
2d350 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
2d360 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
2d370 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d380 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65     if( nUri ) me
2d390 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46  mcpy(&pPager->zF
2d3a0 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
2d3b0 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69  e+1], zUri, nUri
2d3c0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2d3d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2d3e0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d3f0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2d400 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2d410 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2d420 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20  "-journal\000", 
2d430 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  8+2);.    sqlite
2d440 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2d450 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d460 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d470 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2d480 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70  E_OMIT_WAL.    p
2d490 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2d4a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2d4b0 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2d4c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d4d0 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61  r->zWal, zPathna
2d4e0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d4f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2d500 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2d510 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c  me], "-wal\000",
2d520 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   4+1);.    sqlit
2d530 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2d540 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d550 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a   pPager->zWal);.
2d560 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2d570 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d580 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2d590 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2d5a0 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2d5b0 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2d5c0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2d5d0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2d5e0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2d5f0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2d600 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2d610 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2d620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2d630 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2d640 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2d650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d660 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2d670 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d680 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2d690 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2d6a0 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2d6b0 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2d6c0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
2d6d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
2d6e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
2d6f0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
2d700 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
2d710 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
2d720 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
2d730 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2d740 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
2d750 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
2d760 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2d770 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
2d780 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
2d790 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
2d7a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2d7b0 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
2d7c0 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
2d7d0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
2d7e0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
2d7f0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
2d800 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
2d810 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
2d820 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
2d830 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
2d840 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
2d850 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d860 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
2d870 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2d880 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2d890 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2d8a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65  );.      if( !re
2d8b0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
2d8c0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2d8d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
2d8e0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44   assert(SQLITE_D
2d8f0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d900 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2d910 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
2d920 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
2d930 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2d940 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2d950 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2d960 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
2d970 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2d980 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
2d990 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2d9a0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
2d9b0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2d9c0 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20  SIZE;.          
2d9d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d9e0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2d9f0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2da00 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2da10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
2da20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2da30 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2da40 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2da50 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
2da60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2da70 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2da80 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
2da90 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2daa0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2dab0 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2dac0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2dad0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2dae0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2daf0 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2db00 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
2db10 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
2db20 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2db30 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
2db40 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
2db50 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
2db60 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
2db70 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
2db80 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2db90 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
2dba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dbb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
2dbc0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
2dbd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2dbe0 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ck = sqlite3_uri
2dbf0 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2dc00 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29  me, "nolock", 0)
2dc10 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63  ;.      if( (iDc
2dc20 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
2dc30 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20  IMMUTABLE)!=0.  
2dc40 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
2dc50 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2dc60 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c  ename, "immutabl
2dc70 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  e", 0) ){.      
2dc80 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20      vfsFlags |= 
2dc90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2dca0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20  ONLY;.          
2dcb0 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65  goto act_like_te
2dcc0 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d  mp_file;.      }
2dcd0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2dce0 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
2dcf0 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
2dd00 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
2dd10 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
2dd20 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
2dd30 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
2dd40 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
2dd50 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
2dd60 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
2dd70 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
2dd80 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
2dd90 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
2dda0 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Write()..    **.
2ddb0 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2ddc0 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66  ch is also run f
2ddd0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2dde0 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d  database. An in-
2ddf0 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61  memory.    ** da
2de00 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61  tabase is the sa
2de10 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c  me as a temp-fil
2de20 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  e that is never 
2de30 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20  written out to. 
2de40 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75     ** disk and u
2de50 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ses an in-memory
2de60 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2de70 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
2de80 20 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73   This branch als
2de90 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73  o runs for files
2dea0 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74   marked as immut
2deb0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63  able..    */ .ac
2dec0 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2ded0 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  :.    tempFile =
2dee0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2def0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2df00 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72  EADER;     /* Pr
2df10 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79  etend we already
2df20 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a   have a lock */.
2df30 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
2df40 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  k = EXCLUSIVE_LO
2df50 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  CK;    /* Preten
2df60 64 20 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c  d we are in EXCL
2df70 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20  USIVE mode */.  
2df80 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2df90 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2dfa0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f       /* Do no lo
2dfb0 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61  cking */.    rea
2dfc0 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67  dOnly = (vfsFlag
2dfd0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s&SQLITE_OPEN_RE
2dfe0 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20  ADONLY);.  }..  
2dff0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2e000 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65   call to PagerSe
2e010 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76  tPagesize() serv
2e020 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61  es to set the va
2e030 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67  lue of .  ** Pag
2e040 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20  er.pageSize and 
2e050 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
2e060 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
2e070 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  buffer..  */.  i
2e080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e090 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e0a0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
2e0b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2e0c0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
2e0d0 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a  size(pPager, &sz
2e0e0 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20  PageDflt, -1);. 
2e0f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
2e100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2e110 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2e120 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2e130 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ject. */.  if( r
2e140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e150 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
2e160 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e  ra<1000 );.    n
2e170 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
2e180 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d  Extra);.    rc =
2e190 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
2e1a0 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
2e1b0 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1d0 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
2e1e0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
2e1f0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
2e200 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e210 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
2e220 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ror occurred abo
2e230 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61  ve, free the  Pa
2e240 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2e250 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2e260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2e270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e280 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2e290 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2e2a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
2e2b0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
2e2c0 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
2e2d0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2e2e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e2f0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2e300 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2e310 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2e320 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2e330 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2e340 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2e350 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2e360 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2e370 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2e380 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2e390 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2e3a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e3b0 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2e3c0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2e3d0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2e3e0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2e3f0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e400 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2e410 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e420 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2e430 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e440 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2e450 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2e460 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2e470 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2e480 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2e490 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
2e4a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
2e4b0 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
2e4c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
2e4d0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
2e4e0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
2e4f0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2e500 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
2e510 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
2e520 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2e530 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2e540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2e550 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2e560 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
2e570 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2e580 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
2e590 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
2e5a0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2e5b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
2e5c0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2e5d0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
2e5e0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
2e5f0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
2e600 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20  Only;.  assert( 
2e610 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
2e620 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2e630 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
2e640 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
2e650 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
2e660 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2e670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e680 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29  r->fullSync==0 )
2e690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e6a0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2e6b0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2e6c0 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  ( pPager->walSyn
2e6d0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2e6e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e6f0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d  >ckptSyncFlags==
2e700 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
2e710 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2e720 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
2e730 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2e740 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2e750 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
2e760 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  walSyncFlags = S
2e770 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2e780 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41  L | WAL_SYNC_TRA
2e790 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70  NSACTIONS;.    p
2e7a0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2e7b0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2e7c0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
2e7d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2e7e0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
2e7f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
2e800 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
2e810 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
2e820 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e830 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
2e840 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
2e850 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
2e860 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
2e870 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
2e880 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
2e890 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2e8a0 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
2e8b0 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
2e8c0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
2e8d0 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29  f( !useJournal )
2e8e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2e8f0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2e900 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2e910 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  F;.  }else if( m
2e920 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
2e930 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2e940 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2e950 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
2e960 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
2e970 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
2e980 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2e990 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
2e9a0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e9b0 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
2e9c0 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  init;.  /* memse
2e9d0 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
2e9e0 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
2e9f0 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
2ea00 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d   /* pPager->szMm
2ea10 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ap = SQLITE_DEFA
2ea20 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f  ULT_MMAP_SIZE //
2ea30 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20   will be set by 
2ea40 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70  btree.c */..  *p
2ea50 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
2ea60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ea70 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69  _OK;.}.../* Veri
2ea80 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
2ea90 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
2eaa0 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20  t be deleted or 
2eab0 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d  renamed out from
2eac0 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61  .** under the pa
2ead0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ger.  Return SQL
2eae0 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61  ITE_OK if the da
2eaf0 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20  tabase is still 
2eb00 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a  were it ought.**
2eb10 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20   to be on disk. 
2eb20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
2eb30 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   (SQLITE_READONL
2eb40 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d  Y_DBMOVED or som
2eb50 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  e other error.**
2eb60 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
2eb70 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66  e3OsAccess()) if
2eb80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
2eb90 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a  s gone missing..
2eba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
2ebb0 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
2ebc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ebd0 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20    int bHasMoved 
2ebe0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
2ebf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
2ec00 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  mpFile ) return 
2ec10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2ec20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
2ec30 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2ec40 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
2ec50 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2ec60 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46  me && pPager->zF
2ec70 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  ilename[0] );.  
2ec80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
2ec90 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
2eca0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
2ecb0 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62  TL_HAS_MOVED, &b
2ecc0 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28  HasMoved);.  if(
2ecd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
2ece0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OUND ){.    /* I
2ecf0 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20  f the HAS_MOVED 
2ed00 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20  file-control is 
2ed10 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61  unimplemented, a
2ed20 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
2ed30 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ile.    ** has n
2ed40 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20  ot been moved.  
2ed50 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74  That is the hist
2ed60 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20  orical behavior 
2ed70 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72  of SQLite: prior
2ed80 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   to.    ** versi
2ed90 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76  on 3.8.3, it nev
2eda0 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  er checked */.  
2edb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2edc0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
2edd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2ede0 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  HasMoved ){.    
2edf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
2ee00 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20  ONLY_DBMOVED;.  
2ee10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2ee20 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
2ee30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2ee40 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
2ee50 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
2ee60 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
2ee70 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
2ee80 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
2ee90 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2eea0 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
2eeb0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
2eec0 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
2eed0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
2eee0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
2eef0 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
2ef00 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
2ef10 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
2ef20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
2ef30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
2ef40 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
2ef50 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
2ef60 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
2ef70 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
2ef80 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
2ef90 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
2efa0 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
2efb0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2efc0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
2efd0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
2efe0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
2eff0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2f000 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2f010 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2f020 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
2f030 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2f040 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
2f050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f060 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
2f070 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
2f080 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
2f090 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2f0a0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
2f0b0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
2f0c0 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
2f0d0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
2f0e0 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
2f0f0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
2f100 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
2f110 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
2f120 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2f130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2f140 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
2f150 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
2f160 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2f170 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
2f180 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2f190 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
2f1a0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
2f1b0 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
2f1c0 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
2f1d0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
2f1e0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2f1f0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2f200 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
2f210 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2f220 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
2f230 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
2f240 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2f250 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
2f260 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
2f270 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2f280 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
2f290 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
2f2a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
2f2b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
2f2c0 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
2f2d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f2e0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
2f2f0 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
2f300 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
2f310 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
2f320 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
2f330 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
2f340 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2f350 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
2f360 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2f370 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
2f380 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
2f390 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
2f3a0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2f3b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2f3c0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2f3d0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2f3e0 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
2f3f0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2f400 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
2f410 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
2f420 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
2f430 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2f440 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2f450 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
2f460 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2f470 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
2f480 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2f490 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
2f4a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
2f4b0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2f4c0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
2f4d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f4e0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
2f4f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2f500 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f520 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
2f530 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2f540 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
2f550 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
2f560 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
2f570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f580 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2f590 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2f5a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2f5b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f5c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2f5d0 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
2f5e0 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
2f5f0 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
2f600 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2f610 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
2f620 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
2f630 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
2f640 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
2f650 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
2f660 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2f670 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2f680 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
2f690 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2f6a0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
2f6b0 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
2f6c0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
2f6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
2f6e0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
2f6f0 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
2f700 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f710 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
2f720 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2f730 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
2f740 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
2f750 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
2f760 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
2f770 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
2f780 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
2f790 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
2f7a0 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
2f7b0 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
2f7c0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
2f7d0 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
2f7e0 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
2f7f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
2f800 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
2f810 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
2f820 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
2f830 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
2f840 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2f850 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
2f860 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
2f870 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
2f880 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
2f890 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2f8a0 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
2f8b0 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
2f8c0 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
2f8d0 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
2f8e0 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
2f8f0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2f900 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
2f910 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
2f920 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
2f930 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
2f940 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
2f950 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
2f960 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
2f970 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2f980 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
2f990 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
2f9a0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
2f9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f9c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2f9d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2f9e0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
2f9f0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2fa00 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2fa10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fa20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fa30 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2fa40 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73  se is zero pages
2fa50 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d   in size, that m
2fa60 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
2fa70 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20   (1) the.       
2fa80 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61   ** journal is a
2fa90 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20   remnant from a 
2faa0 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77  prior database w
2fab0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2fac0 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20  e where.        
2fad0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2fae0 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65  file but not the
2faf0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c   journal was del
2fb00 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65  eted, or (2) the
2fb10 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20   initial.       
2fb20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
2fb30 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61  that populates a
2fb40 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
2fb50 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
2fb60 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
2fb70 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
2fb80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fb90 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20  can be deleted. 
2fba0 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63   However, take c
2fbb0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  are.        ** n
2fbc0 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ot to delete the
2fbd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
2fbe0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
2fbf0 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20  pen due to.     
2fc00 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f     ** journal_mo
2fc10 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20  de=PERSIST..    
2fc20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2fc30 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21  f( nPage==0 && !
2fc40 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2fc50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
2fc60 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
2fc70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fc80 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
2fc90 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
2fca0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
2fcb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2fcc0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
2fcd0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2fce0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
2fcf0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
2fd00 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2fd10 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  ) pagerUnlockDb(
2fd20 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
2fd30 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
2fd40 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2fd50 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
2fd60 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
2fd70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2fd80 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2fd90 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
2fda0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2fdb0 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
2fdc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
2fdd0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2fde0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2fdf0 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
2fe00 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
2fe10 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
2fe20 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
2fe30 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
2fe40 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
2fe50 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
2fe60 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
2fe70 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
2fe80 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
2fe90 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
2fea0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
2feb0 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
2fec0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
2fed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
2fee0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2fef0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
2ff00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2ff10 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
2ff20 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2ff30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2ff40 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2ff50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2ff60 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2ff70 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
2ff80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ff90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ffa0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2ffb0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
2ffc0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2ffd0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
2ffe0 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
2fff0 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
30000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
30020 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
30030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
30040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30050 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30060 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
30070 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
30080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30090 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
300a0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
300b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
300c0 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
300d0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
300e0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
300f0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
30100 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30110 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
30120 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
30130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
30140 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
30150 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
30160 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
30170 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
30180 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
30190 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
301a0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
301b0 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
301c0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
301d0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
301e0 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
301f0 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
30200 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
30210 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
30220 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
30230 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
30240 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
30250 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
30260 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
30270 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
30280 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
30290 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
302a0 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
302b0 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
302c0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
302d0 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
302e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
302f0 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
30300 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
30310 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
30320 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
30330 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
30340 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30350 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
30360 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
30370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30380 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
303a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
303b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
303c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
303d0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
303e0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
303f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30400 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
30410 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
30420 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
30430 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
30440 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
30450 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
30460 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
30470 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
30480 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
30490 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
304a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
304b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
304c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
304d0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
304e0 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
304f0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
30500 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
30510 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
30520 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
30530 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
30540 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
30550 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30560 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
30570 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
30580 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
30590 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
305a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
305b0 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
305c0 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
305d0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
305e0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
305f0 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
30600 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
30610 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
30620 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
30630 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
30640 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
30650 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
30660 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
30670 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30680 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
30690 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
306a0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
306b0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
306c0 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
306d0 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
306e0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
306f0 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
30700 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
30710 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
30720 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
30730 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
30740 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
30750 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
30760 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
30770 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
30780 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
30790 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
307a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
307b0 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
307c0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
307d0 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
307e0 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
307f0 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
30800 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
30810 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
30820 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
30830 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
30840 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
30850 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
30860 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
30870 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
30880 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30890 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
308a0 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
308b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
308c0 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
308d0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
308e0 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
308f0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
30900 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
30910 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30920 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30930 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
30940 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30950 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30960 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
30970 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30980 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
30990 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
309a0 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
309b0 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
309c0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
309d0 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
309e0 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
309f0 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
30a00 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
30a10 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
30a20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
30a30 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
30a40 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
30a50 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
30a60 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
30a70 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20  e access mode.. 
30a80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
30a90 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
30aa0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
30ab0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
30ac0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
30ad0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
30ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30af0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30b00 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
30b10 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30b20 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28  _READER );.  if(
30b30 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
30b40 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
30b50 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
30b60 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
30b70 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
30b80 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
30b90 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30ba0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
30bb0 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
30bc0 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
30bd0 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
30be0 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
30bf0 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
30c00 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
30c10 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
30c20 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
30c30 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
30c40 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
30c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30c60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30c70 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
30c80 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
30c90 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
30ca0 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
30cb0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
30cc0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
30cd0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
30ce0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
30cf0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
30d00 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
30d10 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
30d20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
30d30 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
30d40 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
30d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
30d60 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
30d70 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
30d80 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
30d90 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
30da0 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
30db0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30dd0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
30de0 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
30df0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
30e00 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
30e10 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
30e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
30e30 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
30e40 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
30e50 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
30e60 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
30e70 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
30e80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30e90 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
30ea0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
30eb0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
30ec0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
30ed0 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
30ee0 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
30ef0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
30f00 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
30f10 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
30f20 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
30f30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
30f40 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
30f50 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
30f60 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
30f70 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
30f80 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
30f90 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
30fa0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
30fb0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
30fc0 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
30fd0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
30fe0 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
30ff0 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
31000 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
31010 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
31020 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
31030 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
31040 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
31050 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
31060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31070 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
31080 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
31090 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
310a0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
310b0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
310c0 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
310d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
310e0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
310f0 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
31100 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
31110 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
31120 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
31130 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
31140 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
31150 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
31160 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
31170 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
31180 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31190 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
311a0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
311b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
311c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
311d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
311e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
311f0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
31200 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
31210 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
31220 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
31230 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31240 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
31250 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
31260 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
31270 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
31280 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
31290 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
312a0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
312b0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
312c0 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
312d0 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
312e0 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
312f0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
31300 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
31310 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
31320 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
31330 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
31340 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
31350 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
31360 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
31370 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
31380 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
31390 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
313a0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
313b0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
313c0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
313d0 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
313e0 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
313f0 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
31400 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
31410 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
31420 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
31430 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
31440 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
31450 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
31460 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
31470 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
31480 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
31490 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
314a0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
314b0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
314c0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
314d0 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
314e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
314f0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
31500 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31510 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
31520 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31530 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
31540 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
31550 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
31560 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
31570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31580 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
31590 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
315a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
315b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
315c0 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
315d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
315e0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
315f0 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
31600 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
31610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31620 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
31630 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
31640 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
31650 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
31660 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
31670 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31680 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31690 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
316a0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
316b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
316c0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
316d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
316e0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
316f0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
31700 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
31710 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
31720 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31730 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
31740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31750 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
31760 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
31770 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31780 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
31790 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
317a0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
317b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
317c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
317d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
317e0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
317f0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
31800 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
31810 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
31820 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
31830 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
31840 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
31850 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
31860 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
31870 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
31880 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
31890 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
318a0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
318b0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
318c0 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
318d0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
318e0 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
318f0 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
31900 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
31910 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
31920 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
31930 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
31940 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
31950 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
31960 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
31970 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
31980 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31990 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
319a0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
319b0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
319c0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
319d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
319e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
319f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31a00 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
31a10 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
31a20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31a40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
31a50 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
31a60 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
31a70 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
31a80 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
31a90 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
31aa0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
31ab0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
31ac0 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
31ad0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31ae0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31af0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
31b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31b10 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
31b20 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
31b30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31b40 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
31b50 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
31b60 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
31b70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
31b80 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
31b90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
31ba0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
31bb0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
31bc0 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
31bd0 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
31be0 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
31bf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
31c00 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
31c10 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
31c20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
31c30 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
31c40 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
31c50 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
31c60 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
31c70 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
31c80 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
31c90 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
31ca0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
31cb0 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
31cc0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
31cd0 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
31ce0 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
31cf0 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
31d00 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
31d10 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
31d20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
31d30 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
31d40 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
31d50 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
31d60 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
31d70 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
31d80 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
31d90 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
31da0 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
31db0 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
31dc0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
31dd0 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
31de0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
31df0 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
31e00 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
31e10 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
31e20 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
31e30 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
31e40 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
31e50 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
31e60 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
31e70 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
31e80 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
31e90 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
31ea0 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
31eb0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
31ec0 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
31ed0 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
31ee0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
31ef0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
31f00 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
31f10 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
31f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
31f30 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31f40 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
31f50 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
31f60 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
31f70 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
31f80 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
31f90 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
31fa0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
31fb0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
31fc0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
31fd0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
31fe0 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
31ff0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32000 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
32010 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
32020 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
32030 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74  red then check t
32040 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
32050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
32060 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
32070 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
32080 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a  se has changed,.
32090 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
320a0 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68  he cache.  The h
320b0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
320c0 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
320d0 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
320e0 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74  * occurring on t
320f0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63  he very first ac
32100 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20  cess to a file, 
32110 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65  in order to save
32120 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
32130 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  le unnecessary s
32140 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
32150 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74  all at the start
32160 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -up..      **.  
32170 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
32180 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65  changes are dete
32190 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
321a0 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
321b0 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
321c0 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
321d0 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
321e0 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
321f0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
32200 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
32210 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
32220 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
32230 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
32240 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
32250 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
32260 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
32270 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
32280 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
32290 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
322a0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
322b0 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
322c0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
322d0 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
322e0 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
322f0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
32300 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
32310 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
32320 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
32330 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
32340 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
32350 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
32360 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
32370 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
32380 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
32390 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
323a0 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
323b0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
323c0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
323d0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
323e0 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
323f0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
32400 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
32410 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
32420 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
32430 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32440 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
32450 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
32460 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
32470 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32480 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
32490 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
324a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
324b0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
324c0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
324d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
324e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
324f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
32500 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
32510 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
32520 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32530 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32540 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
32550 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
32560 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32570 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
32580 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
32590 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
325a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  );..        /* U
325b0 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73  nmap the databas
325c0 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f  e file. It is po
325d0 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65  ssible that exte
325e0 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20  rnal processes. 
325f0 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61         ** may ha
32600 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65  ve truncated the
32610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32620 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64  nd then extended
32630 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20   it back.       
32640 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69   ** to its origi
32650 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74  nal size while t
32660 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20  his process was 
32670 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  not holding a lo
32680 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
32690 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
326a0 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61  e may exist a Pa
326b0 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67  ger.pMap mapping
326c0 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20   that appears.  
326d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74        ** to be t
326e0 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75  he right size bu
326f0 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  t is not actuall
32700 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74  y valid. Avoid t
32710 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
32720 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e  ossibility by un
32730 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68  mapping the db h
32740 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
32750 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
32760 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
32770 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
32780 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
32790 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
327a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
327b0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
327c0 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
327d0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
327e0 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
327f0 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
32800 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
32810 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
32820 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
32830 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
32840 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
32850 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
32860 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65  (pPager);.#ifnde
32870 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
32880 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
32890 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
328a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
328b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
328c0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
328d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
328e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
328f0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
32900 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
32910 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32920 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
32930 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32940 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
32950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32960 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
32970 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
32980 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
32990 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
329a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
329b0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
329c0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
329d0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
329e0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
329f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32a00 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
32a20 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
32a30 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
32a40 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
32a50 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
32a60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
32a70 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
32a80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
32a90 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
32aa0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
32ab0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
32ac0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
32ad0 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
32ae0 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
32af0 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
32b00 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
32b10 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
32b20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
32b30 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
32b40 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
32b50 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
32b60 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
32b70 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
32b80 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
32b90 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
32ba0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
32bb0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
32bc0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
32bd0 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d  ager->nMmapOut==
32be0 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61  0 && (sqlite3Pca
32bf0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
32c00 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
32c10 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
32c20 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
32c30 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
32c40 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
32c50 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32c60 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
32c70 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
32c80 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
32c90 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
32ca0 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
32cb0 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
32cc0 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
32cd0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
32ce0 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
32cf0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
32d00 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
32d10 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
32d20 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
32d30 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
32d40 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
32d50 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
32d60 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
32d70 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
32d80 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
32d90 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
32da0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
32db0 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
32dc0 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
32dd0 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
32de0 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
32df0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
32e00 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
32e10 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
32e20 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
32e30 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
32e40 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
32e50 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
32e60 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
32e70 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
32e80 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
32e90 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
32ea0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
32eb0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
32ec0 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
32ed0 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
32ee0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
32ef0 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
32f00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32f10 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
32f20 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
32f30 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
32f40 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
32f50 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
32f60 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
32f70 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
32f80 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
32f90 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
32fa0 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
32fb0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
32fc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
32fd0 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
32fe0 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
32ff0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
33000 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
33010 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
33020 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
33030 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
33040 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
33050 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
33060 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
33070 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
33080 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
33090 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
330a0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
330b0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
330c0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
330d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
330e0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
330f0 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
33100 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
33110 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
33120 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
33130 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
33140 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
33150 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
33160 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
33170 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
33180 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
33190 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
331a0 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
331b0 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
331c0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
331d0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
331e0 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
331f0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
33200 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
33210 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
33220 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
33230 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
33240 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
33250 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
33260 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
33270 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
33280 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
33290 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
332a0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
332b0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
332c0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
332d0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
332e0 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
332f0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
33300 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
33310 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
33320 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
33330 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
33340 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
33350 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
33360 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
33370 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
33380 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
33390 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
333a0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
333b0 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
333c0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
333d0 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
333e0 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
333f0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
33400 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
33410 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
33420 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
33430 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
33440 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
33450 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
33460 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
33470 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
33480 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
33490 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
334a0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
334b0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
334c0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
334d0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
334e0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
334f0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
33500 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
33510 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
33520 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
33530 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
33540 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
33550 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
33560 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
33570 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
33580 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
33590 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
335a0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
335b0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
335c0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
335d0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
335e0 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
335f0 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
33600 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
33610 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
33620 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
33630 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  t sqlite3PagerGe
33640 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  t(.  Pager *pPag
33650 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
33660 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
33670 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33680 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
33690 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
336a0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
336b0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
336c0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
336d0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
336e0 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
336f0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
33700 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
33710 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
33720 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
33730 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
33740 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33  r *pPg = 0;.  u3
33750 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
33760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33770 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
33780 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
33790 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f    const int noCo
337a0 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26  ntent = (flags &
337b0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
337c0 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20  TENT);..  /* It 
337d0 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f  is acceptable to
337e0 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79   use a read-only
337f0 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72   (mmap) page for
33800 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74   any page except
33810 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20  .  ** page 1 if 
33820 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74  there is no writ
33830 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
33840 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52  en or the ACQUIR
33850 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  E_READONLY.  ** 
33860 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69  flag was specifi
33870 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
33880 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73  . And so long as
33890 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61   the db is not a
338a0 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
338b0 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   or in-memory da
338c0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f  tabase.  */.  co
338d0 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20  nst int bMmapOk 
338e0 3d 20 28 70 67 6e 6f 3e 31 20 26 26 20 55 53 45  = (pgno>1 && USE
338f0 46 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20  FETCH(pPager).  
33900 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
33910 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
33920 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41  R || (flags & PA
33930 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
33940 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  )).#ifdef SQLITE
33950 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26  _HAS_CODEC.   &&
33960 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
33970 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a  =0.#endif.  );..
33980 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f    /* Optimizatio
33990 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20  n note:  Adding 
339a0 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65  the "pgno<=1" te
339b0 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d  rm before "pgno=
339c0 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c  =0" here.  ** al
339d0 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lows the compile
339e0 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72  r optimizer to r
339f0 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73  euse the results
33a00 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22   of the "pgno>1"
33a10 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68  .  ** test in th
33a20 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65  e previous state
33a30 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20  ment, and avoid 
33a40 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20  testing pgno==0 
33a50 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d  in the.  ** comm
33a60 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67  on case where pg
33a70 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a  no is large. */.
33a80 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26    if( pgno<=1 &&
33a90 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
33aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
33ab0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
33ac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33ad0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
33ae0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
33af0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
33b00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
33b10 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f  ;.  assert( noCo
33b20 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61  ntent==0 || bMma
33b30 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73  pOk==0 );..  ass
33b40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73  ert( pPager->has
33b50 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d  HeldSharedLock==
33b60 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  1 );..  /* If th
33b70 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
33b80 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
33b90 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
33ba0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
33bb0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
33bc0 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
33bd0 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
33be0 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
33bf0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
33c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33c10 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
33c20 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
33c30 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
33c40 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
33c50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
33c60 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
33c70 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
33c80 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
33c90 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
33ca0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33cb0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33cc0 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
33cd0 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
33ce0 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  & iFrame==0 ){. 
33cf0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
33d00 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20   = 0;..      rc 
33d10 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
33d20 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
33d30 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67          (i64)(pg
33d40 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
33d50 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72  pageSize, pPager
33d60 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61  ->pageSize, &pDa
33d70 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  ta.      );..   
33d80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33d90 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
33da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
33db0 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
33dc0 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20  R_READER ){.    
33dd0 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
33de0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
33df0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
33e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33e10 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
33e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
33e30 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
33e40 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
33e50 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20  Data, &pPg);.   
33e60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
33e80 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
33e90 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
33ea0 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
33eb0 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
33ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
33ed0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
33ee0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
33ef0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
33f00 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
33f10 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  Pg;.          re
33f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33f40 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
33f50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33f60 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
33f70 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
33f80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33f90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
33fa0 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61  pcache_page *pBa
33fb0 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20  se;.      pBase 
33fc0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
33fd0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
33fe0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  ache, pgno, 3);.
33ff0 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
34000 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
34010 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34020 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67  FetchStress(pPag
34030 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34040 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20  o, &pBase);.    
34050 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34060 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34070 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34080 20 20 20 20 20 20 20 20 69 66 28 20 70 42 61 73          if( pBas
34090 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
340a0 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20    pPg = *ppPage 
340b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
340c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
340d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
340e0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
340f0 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rr;.        }.  
34100 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
34110 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
34120 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
34130 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
34140 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
34150 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
34160 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20  ( pPg!=0 );.    
34170 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
34180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34190 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
341a0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
341b0 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
341c0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
341d0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
341e0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
341f0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
34200 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34210 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
34220 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
34230 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
34240 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
34250 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
34260 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
34270 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34280 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
34290 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65  t( pPg==(*ppPage
342a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
342b0 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
342c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
342d0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
342e0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
342f0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  0 );..  if( pPg-
34300 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
34310 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
34320 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34330 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
34340 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
34350 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
34360 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
34370 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
34380 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
34390 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
343a0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
343b0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
343c0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
343d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
343e0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
343f0 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74  _HIT]++;.    ret
34400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
34410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
34420 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
34430 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
34440 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
34450 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
34460 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
34470 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50  zed.  */..    pP
34480 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
34490 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
344a0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
344b0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
344c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
344d0 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
344e0 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
344f0 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
34500 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
34510 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
34520 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
34530 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
34540 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
34550 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34560 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
34570 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34580 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
34590 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
345a0 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
345b0 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
345c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
345d0 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
345e0 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
345f0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
34600 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
34610 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
34620 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
34630 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
34640 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34650 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34660 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
34670 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
34680 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
34690 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
346a0 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
346b0 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
346c0 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
346d0 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
346e0 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
346f0 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
34700 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
34710 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
34720 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
34730 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
34740 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
34750 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
34760 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
34770 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
34780 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
34790 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
347a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
347b0 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
347c0 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
347d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
347e0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
347f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
34800 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
34810 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
34820 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
34830 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
34840 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
34850 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
34860 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
34870 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
34880 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34890 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
348a0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
348b0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
348c0 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
348d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
348e0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
348f0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34900 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
34910 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
34920 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
34930 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
34940 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
34950 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
34960 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
34970 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
34980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34990 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
349a0 28 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61  (pPager) && bMma
349b0 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pOk==0 ){.      
349c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
349d0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
349e0 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
349f0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
34a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34a10 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
34a20 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34a30 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
34a40 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
34a50 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
34a60 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
34a70 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
34a80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
34a90 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
34aa0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
34ab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34ac0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34ad0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34af0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
34b00 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
34b10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34b20 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
34b30 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
34b40 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
34b50 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
34b60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
34b70 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
34b80 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
34b90 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
34ba0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
34bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34bc0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
34bd0 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
34be0 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
34bf0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
34c00 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
34c10 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
34c20 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
34c30 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
34c40 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
34c50 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
34c60 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65  ache. .**.** See
34c70 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
34c80 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
34c90 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
34ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
34cb0 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
34cc0 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
34cd0 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
34ce0 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
34cf0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
34d00 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
34d10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
34d20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
34d30 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
34d40 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
34d50 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
34d60 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
34d70 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
34d80 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
34d90 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
34da0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
34db0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
34dc0 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65   pgno){.  sqlite
34dd0 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
34de0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
34df0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
34e00 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
34e10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34e20 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
34e30 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69  ;.  pPage = sqli
34e40 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
34e50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34e60 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  pgno, 0);.  asse
34e70 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20  rt( pPage==0 || 
34e80 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
34e90 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69  haredLock );.  i
34ea0 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65  f( pPage==0 ) re
34eb0 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
34ec0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34ed0 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
34ee0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34ef0 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pPage);.}../*.*
34f00 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
34f10 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
34f20 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
34f30 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
34f40 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
34f50 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
34f60 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
34f70 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
34f80 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
34f90 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
34fa0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
34fb0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
34fc0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
34fd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
34fe0 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
34ff0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
35000 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
35010 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67  Null(DbPage *pPg
35020 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
35030 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
35040 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  g!=0 );.  pPager
35050 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35060 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
35070 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
35080 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73  .    pagerReleas
35090 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20  eMapPage(pPg);. 
350a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
350b0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
350c0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
350d0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
350e0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64  (pPager);.}.void
350f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35100 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
35110 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c  .  if( pPg ) sql
35120 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
35130 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f  tNull(pPg);.}../
35140 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35150 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
35160 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
35170 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
35180 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
35190 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
351a0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
351b0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
351c0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
351d0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
351e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
351f0 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
35200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
35210 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
35220 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
35230 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
35240 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
35250 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
35260 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
35270 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
35280 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
35290 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
352a0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
352b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
352c0 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
352d0 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
352e0 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
352f0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
35300 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
35310 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
35320 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
35330 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
35340 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
35350 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35360 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
35370 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
35380 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
35390 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
353a0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
353b0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
353c0 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
353d0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
353e0 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
353f0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
35400 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
35410 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
35420 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
35430 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
35440 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
35450 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
35460 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
35470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
35480 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
35490 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
354a0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
354b0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
354c0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
354d0 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
354e0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
354f0 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
35500 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
35510 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
35520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35530 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
35540 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
35550 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
35560 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
35570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
35580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35590 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
355a0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
355b0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
355c0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
355d0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
355e0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
355f0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
35600 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35610 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35620 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
35630 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35640 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35660 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35670 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
35680 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
35690 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
356a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
356b0 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
356c0 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
356d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
356e0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
356f0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
35700 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
35710 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
35720 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35730 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
35740 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35750 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
35760 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
35770 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
35780 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
35790 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
357a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
357b0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
357c0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
357d0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
357e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
357f0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
35800 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35810 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
35820 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
35830 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35840 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
35850 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
35860 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
35870 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
35880 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
35890 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
358a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
358b0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
358c0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
358d0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
358e0 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
358f0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
35900 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
35910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35920 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
35930 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
35940 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  */.          SQL
35950 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
35960 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
35970 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
35980 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
35990 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
359a0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
359b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
359c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
359d0 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
359e0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
359f0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
35a00 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20           );..   
35a10 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
35a20 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
35a30 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73   still has the s
35a40 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64  ame name as it d
35a50 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  id when.        
35a60 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  ** it was origin
35a70 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  ally opened. */.
35a80 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74          rc = dat
35a90 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70  abaseIsUnmoved(p
35aa0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
35ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35ac0 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  K ){.#ifdef SQLI
35ad0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
35ae0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20  _WRITE.         
35af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
35b00 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
35b10 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
35b20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
35b30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
35b40 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
35b50 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
35b60 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
35b70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35b80 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
35b90 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
35ba0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
35bb0 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
35bc0 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
35bd0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
35be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35bf0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
35c00 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
35c10 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
35c20 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
35c30 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
35c40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35c50 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
35c60 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
35c70 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
35c80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
35c90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35ca0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
35cb0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
35cc0 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
35cd0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
35ce0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
35cf0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
35d00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
35d10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35d20 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
35d30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
35d40 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
35d50 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
35d60 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
35d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
35d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35d90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
35da0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
35db0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
35dc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
35dd0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
35de0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
35df0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35e00 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35e10 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
35e20 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
35e30 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
35e40 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
35e50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35e60 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
35e70 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
35e80 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
35e90 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
35ea0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
35eb0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
35ec0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
35ed0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
35ee0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
35ef0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
35f00 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
35f10 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
35f20 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
35f30 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
35f40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
35f50 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
35f60 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
35f70 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
35f80 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
35f90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
35fa0 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
35fb0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
35fc0 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
35fd0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
35fe0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
35ff0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
36000 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
36010 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
36020 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
36030 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
36040 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
36050 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
36060 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
36070 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
36080 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
36090 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
360a0 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
360b0 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
360c0 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
360d0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
360e0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
360f0 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
36100 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
36110 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
36120 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
36130 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
36140 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
36150 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
36160 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
36170 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
36180 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
36190 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
361a0 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
361b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
361c0 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
361d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
361e0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
361f0 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
36200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36210 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
36220 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
36230 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
36240 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36250 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
36260 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
36270 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
36280 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65  ERROR );.  pPage
36290 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
362a0 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
362b0 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  ry;..  if( ALWAY
362c0 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  S(pPager->eState
362d0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20  ==PAGER_READER) 
362e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
362f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36300 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  l==0 );..    if(
36310 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
36320 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
36330 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
36340 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
36350 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
36360 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
36370 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
36380 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
36390 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
363a0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
363b0 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
363c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
363d0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
363e0 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
363f0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
36400 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
36410 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
36420 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
36430 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36440 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
36450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36460 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
36490 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
364a0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
364b0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
364c0 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
364d0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
364e0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
364f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
36500 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
36510 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
36520 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
36530 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
36540 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
36550 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
36560 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
36570 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
36580 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
36590 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
365a0 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
365b0 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
365c0 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
365d0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
365e0 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
365f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36600 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
36610 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
36620 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
36630 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
36640 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
36650 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36660 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
36670 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
36680 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
36690 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
366a0 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
366b0 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
366c0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
366d0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
366e0 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
366f0 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
36700 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
36710 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
36720 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
36730 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
36740 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
36750 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36760 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
36770 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
36780 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
36790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
367a0 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
367b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
367c0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
367d0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
367e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
367f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
36800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36810 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
36820 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
36830 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
36840 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
36850 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
36860 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
36870 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
36880 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
36890 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
368a0 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
368b0 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
368c0 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
368d0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
368e0 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
368f0 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
36900 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
36910 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
36920 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
36930 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
36940 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
36950 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
36960 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
36970 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
36980 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
36990 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
369a0 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
369b0 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
369c0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
369d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
369e0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
369f0 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
36a00 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
36a10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
36a20 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
36a30 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
36a40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
36a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36a60 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
36a70 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36a80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36a90 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
36aa0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
36ab0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
36ac0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36ad0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
36ae0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36af0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
36b00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36b10 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
36b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
36b30 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
36b40 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
36b50 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
36b60 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
36b70 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
36b80 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
36b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
36ba0 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74   page pPg onto t
36bb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f  he end of the ro
36bc0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
36bd0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
36be0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
36bf0 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
36c00 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64  backJournal(PgHd
36c10 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
36c20 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
36c30 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
36c40 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
36c50 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
36c60 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
36c70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
36c80 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
36c90 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
36ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36cb0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
36cc0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
36cd0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
36ce0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
36cf0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
36d00 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
36d10 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ot. */.  assert(
36d20 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
36d30 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
36d40 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
36d50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
36d60 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
36d70 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45  nalOff );.  CODE
36d80 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
36d90 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
36da0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
36db0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
36dc0 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67  );.  cksum = pag
36dd0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
36de0 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
36df0 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
36e00 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
36e10 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
36e20 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
36e30 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  e.  ** page in t
36e40 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
36e50 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
36e60 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
36e70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  age..  ** Otherw
36e80 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
36e90 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
36ea0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
36eb0 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79  gic in.  ** play
36ec0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
36ed0 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
36ee0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
36ef0 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
36f00 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
36f10 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
36f20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
36f30 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
36f40 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72  o,.  ** then cor
36f50 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
36f60 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ow..  */.  pPg->
36f70 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
36f80 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20  EED_SYNC;..  rc 
36f90 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
36fa0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
36fb0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69   pPg->pgno);.  i
36fc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36fd0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
36ff0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
37000 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
37010 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
37020 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
37030 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37040 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74   rc;.  rc = writ
37050 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
37060 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
37070 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
37080 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
37090 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
370a0 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43  rn rc;..  IOTRAC
370b0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
370c0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
370d0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
370e0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
370f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
37100 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
37110 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
37120 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
37130 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  tej_count);.  PA
37140 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
37150 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
37160 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
37170 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
37180 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
37190 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
371a0 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
371b0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
371c0 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
371d0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
371e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
371f0 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
37200 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
37210 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
37220 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37230 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
37240 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
37250 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
37260 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
37270 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73  Pg->pgno);.  tes
37280 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
37290 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73  E_NOMEM );.  ass
372a0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
372b0 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
372c0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c  _NOMEM );.  rc |
372d0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
372e0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
372f0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73  pPg->pgno);.  as
37300 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37310 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
37320 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74  E_NOMEM );.  ret
37330 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37340 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
37350 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
37360 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
37370 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
37380 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
37390 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
373a0 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
373b0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
373c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
373d0 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
373e0 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
373f0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
37400 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
37410 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
37420 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
37430 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
37440 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
37450 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
37460 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
37470 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
37480 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
37490 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
374a0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
374b0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
374c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
374d0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
374e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
374f0 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
37500 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37510 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
37520 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
37530 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
37540 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
37550 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
37560 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
37570 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
37580 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
37590 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
375a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
375b0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
375c0 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
375d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
375e0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
375f0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
37600 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37610 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37620 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
37630 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37640 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37660 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20  ger->errCode==0 
37670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37680 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ger->readOnly==0
37690 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47 45   );.  CHECK_PAGE
376a0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
376b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
376c0 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
376d0 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
376e0 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
376f0 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
37700 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
37710 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
37720 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
37730 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
37740 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
37750 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
37760 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
37770 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
37780 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
37790 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
377a0 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
377b0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
377c0 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
377d0 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
377e0 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
377f0 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
37800 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
37810 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
37820 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
37830 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
37840 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
37850 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
37860 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
37870 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
37880 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
37890 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
378a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
378b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
378c0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
378d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
378e0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
378f0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
37900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
37920 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37930 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
37940 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
37950 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37960 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37970 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
37980 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 74 68  Mark the page th
37990 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  at is about to b
379a0 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 64 69  e modified as di
379b0 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rty. */.  sqlite
379c0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
379d0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
379e0 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
379f0 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20 74 68  al is in use, th
37a00 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  em make sure the
37a10 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61 62   page that is ab
37a20 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e  out.  ** to chan
37a30 67 65 20 69 73 20 69 6e 20 74 68 65 20 72 6f 6c  ge is in the rol
37a40 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f  lback journal, o
37a50 72 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  r if the page is
37a60 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66 66 0a   a new page off.
37a70 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66    ** then end of
37a80 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20   the file, make 
37a90 73 75 72 65 20 69 74 20 69 73 20 6d 61 72 6b 65  sure it is marke
37aa0 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f  d as PGHDR_NEED_
37ab0 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  SYNC..  */.  ass
37ac0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 70 49  ert( (pPager->pI
37ad0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20  nJournal!=0) == 
37ae0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
37af0 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
37b00 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
37b10 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  =0.   && sqlite3
37b20 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
37b30 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  l(pPager->pInJou
37b40 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
37b50 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  ==0.  ){.    ass
37b60 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
37b70 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
37b80 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
37b90 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
37ba0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
37bb0 20 3d 20 70 61 67 65 72 41 64 64 50 61 67 65 54   = pagerAddPageT
37bc0 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c  oRollbackJournal
37bd0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
37be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37bf0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37c00 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
37c20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37c30 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
37c40 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
37c50 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
37c60 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
37c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47       }.      PAG
37c80 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
37c90 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
37ca0 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
37cb0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
37cc0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
37cd0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
37ce0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
37cf0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
37d00 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20  ?1:0)));.    }. 
37d10 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 47 48   }..  /* The PGH
37d20 44 52 5f 44 49 52 54 59 20 62 69 74 20 69 73 20  DR_DIRTY bit is 
37d30 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e 20 74  set above when t
37d40 68 65 20 70 61 67 65 20 77 61 73 20 61 64 64 65  he page was adde
37d50 64 20 74 6f 20 74 68 65 20 64 69 72 74 79 2d 6c  d to the dirty-l
37d60 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66  ist.  ** and bef
37d70 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20  ore writing the 
37d80 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 72 6f  page into the ro
37d90 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
37da0 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c   Wait until now,
37db0 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20  .  ** after the 
37dc0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 73 75  page has been su
37dd0 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e  ccessfully journ
37de0 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20 73 65  alled, before se
37df0 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50  tting the.  ** P
37e00 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 20 62  GHDR_WRITEABLE b
37e10 69 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  it that indicate
37e20 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
37e30 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 6d 6f  can be safely mo
37e40 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  dified..  */.  p
37e50 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
37e60 44 52 5f 57 52 49 54 45 41 42 4c 45 3b 0a 20 20  DR_WRITEABLE;.  
37e70 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
37e80 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
37e90 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
37ea0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
37eb0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74  ,.  ** then writ
37ec0 65 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  e the page into 
37ed0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37ee0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
37ef0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
37f00 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20 20 72 63  oint>0 ){.    rc
37f10 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
37f20 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29  eIfRequired(pPg)
37f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
37f40 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
37f50 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
37f60 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
37f70 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
37f80 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
37f90 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
37fa0 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
37fb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37fc0 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e  This is a varian
37fd0 74 20 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65  t of sqlite3Page
37fe0 72 57 72 69 74 65 28 29 20 74 68 61 74 20 72 75  rWrite() that ru
37ff0 6e 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 74  ns when the sect
38000 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61  or size.** is la
38010 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
38020 67 65 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65  ge size.  SQLite
38030 20 6d 61 6b 65 73 20 74 68 65 20 28 72 65 61 73   makes the (reas
38040 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69  onable) assumpti
38050 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62  on that.** all b
38060 79 74 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72  ytes of a sector
38070 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67   are written tog
38080 65 74 68 65 72 20 62 79 20 68 61 72 64 77 61 72  ether by hardwar
38090 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62  e.  Hence, all b
380a0 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63  ytes of.** a sec
380b0 74 6f 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  tor need to be j
380c0 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73  ournalled in cas
380d0 65 20 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  e of a power los
380e0 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
380f0 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a  of.** a write..*
38100 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
38110 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
38120 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
38130 75 61 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20  ual to the page 
38140 73 69 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a  size, in which.*
38150 2a 20 63 61 73 65 20 70 61 67 65 73 20 63 61 6e  * case pages can
38160 20 62 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79   be individually
38170 20 77 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20   written.  This 
38180 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e  routine only run
38190 73 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 63 65  s in the.** exce
381a0 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 77 68 65  ptional case whe
381b0 72 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  re the page size
381c0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
381d0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
381e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
381f0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
38200 70 61 67 65 72 57 72 69 74 65 4c 61 72 67 65 53  pagerWriteLargeS
38210 65 63 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67  ector(PgHdr *pPg
38220 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
38230 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
38240 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
38250 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65   */.  Pgno nPage
38260 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
38270 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
38280 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
38290 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
382a0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
382b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
382c0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
382d0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
382e0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
382f0 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30  .  int nPage = 0
38300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
38310 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
38320 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
38330 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
38340 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
38350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38360 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
38370 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  */.  int needSyn
38380 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
38390 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
383a0 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
383b0 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 20 20 50  NEED_SYNC */.  P
383c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
383d0 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 54  Pg->pPager; /* T
383e0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 6f 77  he pager that ow
383f0 6e 73 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ns pPg */.  Pgno
38400 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
38410 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
38420 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
38430 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53  geSize);..  /* S
38440 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c  et the doNotSpil
38450 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 74 6f 20  l NOSYNC bit to 
38460 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
38470 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
38480 6f 77 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  ow.  ** a journa
38490 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  l header to be w
384a0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
384b0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
384c0 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ed by.  ** this 
384d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
384e0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
384f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
38500 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
38510 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53   & SPILLFLAG_NOS
38520 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61  YNC)==0 );.  pPa
38530 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
38540 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  |= SPILLFLAG_NOS
38550 59 4e 43 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  YNC;..  /* This 
38560 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
38570 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
38580 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
38590 2d 73 69 7a 65 20 61 72 65 0a 20 20 2a 2a 20 61  -size are.  ** a
385a0 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
385b0 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
385c0 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
385d0 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a  e identifier.  *
385e0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
385f0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
38600 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
38610 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 67 31 20   on..  */.  pg1 
38620 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
38630 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
38640 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
38650 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61  nPageCount = pPa
38660 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69  ger->dbSize;.  i
38670 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
38680 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e  geCount ){.    n
38690 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
386a0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 7d 65  o - pg1)+1;.  }e
386b0 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
386c0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
386d0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
386e0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43