/ Hex Artifact Content
Login

Artifact f6bb1fa6cdf2062f2d8aec3e64db302bca519ab8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 20 2f 2a 20 4e 65 76  0x01      /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
7420: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
7430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7440: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7450: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7460: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7470: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7480: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7490: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
74a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
74b0: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
74c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
74d0: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
74e0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
74f0: 2f 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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7550: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7560: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7570: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7580: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7590: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
75a0: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
75b0: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
75c0: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
75d0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
75e0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
75f0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
7600: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
7610: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
7620: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
7630: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7640: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7650: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7660: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7680: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7690: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
76a0: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
76b0: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
76c0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
76d0: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
76e0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
76f0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
7700: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
7710: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
7720: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
7730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7740: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7750: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7760: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7770: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7790: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
77a0: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
77b0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
77c0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
77d0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
77e0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
77f0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
7800: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
7810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7820: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
7830: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7840: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7850: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7860: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7870: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7880: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7890: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
78a0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20  subjInMemory;   
78b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
78c0: 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72   to use in-memor
78d0: 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  y sub-journals *
78e0: 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b  /.  Pgno dbSize;
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
7910: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
7920: 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f  se */.  Pgno dbO
7930: 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
7940: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
7950: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
7960: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
7970: 20 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a    Pgno dbFileSiz
7980: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7990: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
79a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
79b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
79c0: 64 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20  dbHintSize;     
79d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
79e0: 70 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f  passed to FCNTL_
79f0: 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a  SIZE_HINT call *
7a00: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
7a30: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
7a40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  s */.  int nRec;
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72     /* Pages jour
7a70: 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73  nalled since las
7a80: 74 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74  t j-header writt
7a90: 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  en */.  u32 cksu
7aa0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
7ab0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
7ac0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
7ad0: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
7ae0: 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52  m */.  u32 nSubR
7af0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
7b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7b10: 72 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20  records written 
7b20: 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  to sub-journal *
7b30: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a  /.  Bitvec *pInJ
7b40: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7b50: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
7b60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
7b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7b80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7b90: 2a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *fd;           /
7ba0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7bb0: 72 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a  r for database *
7bc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7bd0: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
7be0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7bf0: 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72  or for main jour
7c00: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
7c10: 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20  _file *sjfd;    
7c20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7c30: 63 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d  criptor for sub-
7c40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
7c50: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
7c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7c70: 65 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74  ent write offset
7c80: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
7c90: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
7ca0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
7cb0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
7cc0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
7cd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7ce0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
7cf0: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
7d00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
7d10: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
7d20: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
7d30: 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  */.  PagerSavepo
7d40: 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b  int *aSavepoint;
7d50: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74   /* Array of act
7d60: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a  ive savepoints *
7d70: 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  /.  int nSavepoi
7d80: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
7d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
7da0: 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f  ments in aSavepo
7db0: 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20  int[] */.  char 
7dc0: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
7dd0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
7de0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
7df0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
7e00: 20 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65   */..  u8 bUseFe
7e10: 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
7e20: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
7e30: 65 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20  e xFetch() */.  
7e40: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e60: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7e70: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7e80: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7e90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ea0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
7eb0: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
7ec0: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
7ed0: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
7ee0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
7ef0: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
7f00: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
7f10: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
7f20: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7f30: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7f40: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
7f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7fa0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7fc0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7fd0: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7fe0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7ff0: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8010: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8020: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8030: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8040: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
8050: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
8060: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
8070: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
8080: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
80a0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
80b0: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
80c0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
80d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80f0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8100: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8120: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8130: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8140: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
8150: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
8160: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
8170: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
8180: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
8190: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
81a0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
81b0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
81c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
81d0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
81e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
81f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8210: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8220: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8230: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8240: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
8250: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
8260: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
8270: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
8280: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
8290: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
82a0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
82b0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
82c0: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
82d0: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
82e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
82f0: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8320: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8330: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8340: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
8350: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
8360: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
8370: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
8380: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
8390: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
83a0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
83b0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
83c0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
83d0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
83e0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
83f0: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8400: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8410: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8420: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8430: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8440: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
8450: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
8460: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
8470: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
8480: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
8490: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
84a0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
84b0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
84c0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
84d0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
84e0: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
84f0: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8500: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8510: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8520: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8530: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8540: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
8550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8560: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
8570: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
8580: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
8590: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
85a0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
85b0: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
85c0: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
85d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
85e0: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
85f0: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8600: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8610: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8620: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8630: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8640: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
8650: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
8660: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
8670: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
8680: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
8690: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
86a0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
86b0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
86c0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
86d0: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
86e0: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
86f0: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8700: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8710: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8720: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8730: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8740: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
8750: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
8760: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
8770: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
8780: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
8790: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
87a0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
87b0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
87c0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
87d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
87e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
87f0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8800: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8810: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8820: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8840: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
8850: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
8860: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8870: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
8880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8890: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
88a0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
88b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
88c0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
88d0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
88e0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
88f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8900: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8910: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8920: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8930: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8940: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
8950: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
8960: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8970: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
8980: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
8990: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
89a0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
89b0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
89c0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
89d0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
89e0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
89f0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8a00: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8a10: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8a20: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8a30: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8a40: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
8a50: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
8a60: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
8a70: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
8a80: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
8a90: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
8aa0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8ab0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8ac0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8ad0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8ae0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8af0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8b00: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8b10: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8b20: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8b30: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8b40: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
8b50: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
8b60: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
8b70: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8b80: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
8b90: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8ba0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8bb0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8bc0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8bd0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8be0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8bf0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8c00: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8c10: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8c20: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8c30: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8c40: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
8c50: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
8c60: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
8c70: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
8c80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
8c90: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
8ca0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8cb0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8cc0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8cd0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8ce0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8cf0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8d00: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8d10: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8d20: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8d30: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8d40: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8d50: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8d60: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8d70: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8d80: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8d90: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8da0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8db0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8dc0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8dd0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8de0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8df0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8e00: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8e10: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8e20: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8e30: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8e40: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8e50: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8e60: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8e70: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8e80: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8ea0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
8eb0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
8ec0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
8ed0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
8ee0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
8ef0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
8f00: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
8f10: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
8f20: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
8f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8f40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
8f50: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
8f60: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
8f70: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
8f80: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
8f90: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
8fa0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
8fb0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
8fc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
8fd0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
8fe0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
8ff0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
9000: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
9010: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
9020: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
9030: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
9040: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
9050: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
9060: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
9070: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
9080: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
9090: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
90a0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
90b0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
90c0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
90d0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
90e0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
90f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9100: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
9110: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
9120: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
9130: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
9140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
9150: 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20  cro USEFETCH is 
9160: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
9170: 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68  llowed to use th
9180: 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e  e xFetch and xUn
9190: 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61  fetch.** interfa
91a0: 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ces to access th
91b0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
91c0: 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
91d0: 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  /O..*/.#if SQLIT
91e0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
91f0: 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  0.# define USEFE
9200: 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73  TCH(x) ((x)->bUs
9210: 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20  eFetch).#else.# 
9220: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9230: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
9240: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
9250: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
9260: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
9270: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
9280: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
9290: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
92a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
92b0: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
92c0: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
92d0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
92e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
92f0: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
9300: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
9310: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
9320: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
9330: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
9340: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
9350: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
9360: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
9370: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
9380: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
9390: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
93a0: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
93b0: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
93c0: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
93d0: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
93e0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
93f0: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
9400: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
9410: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
9420: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
9430: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
9440: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
9450: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
9460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9470: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9480: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
9490: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
94a0: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
94b0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
94c0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
94d0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
94e0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
94f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9500: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
9510: 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20  x,y) 0.# define 
9520: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9530: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9540: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9550: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
9560: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
9570: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
9580: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
9590: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
95a0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
95b0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
95c0: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
95d0: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
95e0: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
95f0: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9600: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9610: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9620: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9630: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9640: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9650: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9660: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
9670: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
9680: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
9690: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
96a0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
96b0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
96c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96d0: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
96e0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
96f0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9700: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9710: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9720: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9730: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9740: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9750: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
9760: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9770: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
9780: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9790: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
97a0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
97b0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
97c0: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
97d0: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
97e0: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
97f0: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9800: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9810: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9830: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9840: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9850: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
9860: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
9870: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
9880: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
9890: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
98a0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
98b0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
98c0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
98d0: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
98f0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9900: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9910: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9920: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9930: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9940: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9960: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
9970: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9980: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
9990: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
99a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
99b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
99c0: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
99d0: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
99e0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
99f0: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9a00: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9a10: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9a20: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9a30: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9a40: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9a50: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
9a60: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
9a70: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
9a80: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
9a90: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
9aa0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
9ab0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9ac0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9ad0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9ae0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9af0: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9b00: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9b10: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9b20: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9b30: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9b40: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9b50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9b60: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
9b70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9b80: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
9b90: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
9ba0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
9bb0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9bc0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9bd0: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9be0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9bf0: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9c00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9c10: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9c20: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9c30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9c40: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9c50: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9c60: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9c70: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
9c80: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
9c90: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
9ca0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
9cb0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9cc0: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9cd0: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9ce0: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9cf0: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9d00: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9d10: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9d20: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9d30: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9d40: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9d50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d60: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9d70: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
9d80: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
9db0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9dc0: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9dd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9de0: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9df0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e10: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9e20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9e30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9e40: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9e50: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
9e60: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
9e70: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
9e80: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9e90: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
9ea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9eb0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ec0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9ed0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ee0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9ef0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9f00: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9f10: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9f20: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9f30: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e PAGER_WRITER_L
9f40: 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73  OCKED:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fd0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9fe0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
9ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a000: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a010: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a020: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a030: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a040: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a050: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a060: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a070: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a080: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a090: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a0a0: 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  ( pPager->setMas
a0b0: 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ter==0 );.      
a0c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a0d0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
a0e0: 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  CHEMOD:.      as
a0f0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a100: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a120: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a130: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a140: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a150: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a160: 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70        /* It is p
a170: 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20  ossible that if 
a180: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a190: 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68   here that neith
a1a0: 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  er the.        *
a1b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
a1c0: 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  or the WAL file 
a1d0: 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68  are open. This h
a1e0: 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20  appens during.  
a1f0: 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62        ** a rollb
a200: 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
a210: 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72  that switches fr
a220: 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  om journal_mode=
a230: 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  off.        ** t
a240: 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  o journal_mode=w
a250: 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  al..        */. 
a260: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a270: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a280: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a290: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a2a0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a2b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a2c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a2d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a2f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a300: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a310: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20  DE_WAL .        
a320: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a330: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a340: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a350: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
a360: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a370: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a380: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
a390: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a3a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a3b0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  e PAGER_WRITER_D
a3c0: 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  BMOD:.      asse
a3d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a3e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a400: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a410: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a420: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a430: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a440: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a450: 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53  p->eLock>=EXCLUS
a460: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a470: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a480: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a490: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a4a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a4b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a4c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a4d0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a4e0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a4f0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a500: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a510: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70  r->dbOrigSize<=p
a520: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a530: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a540: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a550: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
a560: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a570: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a580: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a5a0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a5b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a5c0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a5d0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a5f0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a600: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a610: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a620: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a630: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a640: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a650: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a660: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a680: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52    case PAGER_ERR
a690: 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  OR:.      /* The
a6a0: 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
a6b0: 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
a6c0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ing reference to
a6d0: 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20   the pager if.  
a6e0: 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20      ** in ERROR 
a6f0: 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
a700: 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   the pager shoul
a710: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
a720: 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20  ropped.      ** 
a730: 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
a740: 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
a750: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a760: 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
a770: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a780: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a790: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a7a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
a7b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a7c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
a7d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
a7e0: 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23  def NDEBUG */..#
a7f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a800: 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UG ./*.** Return
a810: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a820: 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73  human readable s
a830: 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69  tring in a stati
a840: 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74  c buffer.** cont
a850: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65  aining the state
a860: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
a870: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61  ject passed as a
a880: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  n argument. This
a890: 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20  .** is intended 
a8a0: 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69  to be used withi
a8b0: 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72  n debuggers. For
a8c0: 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20   example, as an 
a8d0: 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74  alternative.** t
a8e0: 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72  o "print *pPager
a8f0: 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20  " in gdb:.**.** 
a900: 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73  (gdb) printf "%s
a910: 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  ", print_pager_s
a920: 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a  tate(pPager).*/.
a930: 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69  static char *pri
a940: 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50  nt_pager_state(P
a950: 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74  ager *p){.  stat
a960: 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32  ic char zRet[102
a970: 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  4];..  sqlite3_s
a980: 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52  nprintf(1024, zR
a990: 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e  et,.      "Filen
a9a0: 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a  ame:      %s\n".
a9b0: 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20        "State:   
a9c0: 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65        %s errCode
a9d0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f  =%d\n".      "Lo
a9e0: 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c  ck:          %s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e  n".      "Lockin
aa00: 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67  g mode:  locking
aa10: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
aa20: 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a    "Journal mode:
aa30: 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25    journal_mode=%
aa40: 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b  s\n".      "Back
aa50: 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46  ing store: tempF
aa60: 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20  ile=%d memDb=%d 
aa70: 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22  useJournal=%d\n"
aa80: 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a  .      "Journal:
aa90: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66         journalOf
aaa0: 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64  f=%lld journalHd
aab0: 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20  r=%lld\n".      
aac0: 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20  "Size:          
aad0: 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67  dbsize=%d dbOrig
aae0: 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69  Size=%d dbFileSi
aaf0: 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c  ze=%d\n".      ,
ab00: 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20   p->zFilename.  
ab10: 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d      , p->eState=
ab20: 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20  =PAGER_OPEN     
ab30: 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20         ? "OPEN" 
ab40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ab50: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
ab60: 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45  R          ? "RE
ab70: 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20  ADER" :.        
ab80: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab90: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20  _WRITER_LOCKED  
aba0: 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45   ? "WRITER_LOCKE
abb0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
abc0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
abd0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20  ITER_CACHEMOD ? 
abe0: 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  "WRITER_CACHEMOD
abf0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac00: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ac10: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22  TER_DBMOD    ? "
ac20: 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a  WRITER_DBMOD" :.
ac30: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac40: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
ac50: 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54  FINISHED ? "WRIT
ac60: 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20  ER_FINISHED" :. 
ac70: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac80: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20  ==PAGER_ERROR   
ac90: 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52          ? "ERROR
aca0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
acb0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72      , (int)p->er
acc0: 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d  rCode.      , p-
acd0: 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
ace0: 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f          ? "NO_LO
acf0: 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  CK" :.        p-
ad00: 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
ad10: 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52  _LOCK   ? "RESER
ad20: 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  VED" :.        p
ad30: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
ad40: 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c  VE_LOCK  ? "EXCL
ad50: 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20  USIVE" :.       
ad60: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   p->eLock==SHARE
ad70: 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48  D_LOCK     ? "SH
ad80: 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  ARED" :.        
ad90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  p->eLock==UNKNOW
ada0: 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b  N_LOCK    ? "UNK
adb0: 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f  NOWN" : "?error?
adc0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63  ".      , p->exc
add0: 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78  lusiveMode ? "ex
ade0: 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d  clusive" : "norm
adf0: 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  al".      , p->j
ae00: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae10: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ae20: 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79  MORY   ? "memory
ae30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ae40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
ae60: 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a  F      ? "off" :
ae70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ae80: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ae90: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
aea0: 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a  E   ? "delete" :
aeb0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aec0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aed0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
aee0: 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20  ST  ? "persist" 
aef0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
af00: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af10: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
af20: 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65  CATE ? "truncate
af30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
af40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
af50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
af60: 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a  L      ? "wal" :
af70: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
af80: 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46   , (int)p->tempF
af90: 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d  ile, (int)p->mem
afa0: 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a  Db, (int)p->useJ
afb0: 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70  ournal.      , p
afc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d  ->journalOff, p-
afd0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
afe0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69    , (int)p->dbSi
aff0: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72  ze, (int)p->dbOr
b000: 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  igSize, (int)p->
b010: 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a  dbFileSize.  );.
b020: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
b030: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
b040: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
b050: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
b060: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
b070: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
b080: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
b090: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
b0a0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
b0b0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
b0c0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
b0d0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
b0e0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
b0f0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
b100: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b110: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
b120: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
b130: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
b140: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
b150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
b160: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
b170: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
b180: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
b190: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
b1a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
b1b0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
b1c0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
b1d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b1e0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
b1f0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
b200: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
b210: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
b220: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
b230: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
b240: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
b250: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
b260: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
b270: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
b280: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
b290: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
b2a0: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
b2b0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
b2c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
b2d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b2e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b2f0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
b300: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
b310: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
b320: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
b330: 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  nJournal(Pager *
b340: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
b350: 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  Pg){.  return sq
b360: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
b370: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b380: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b390: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b3a0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b3b0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b3c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b3d0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b3e0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b3f0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b400: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b410: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b420: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b430: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b440: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b450: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b460: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b470: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b480: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b490: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b4a0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b4b0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b4c0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b4d0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b4e0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b4f0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b500: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b510: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b520: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b530: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b540: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b550: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b560: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b570: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b580: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b590: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b5a0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b5b0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b5c0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b5d0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b5e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b5f0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b600: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b610: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b620: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b630: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b640: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b650: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b660: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b670: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b680: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b690: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b6a0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b6b0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b6c0: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b6d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b6e0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b6f0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b700: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b710: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b720: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b730: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b740: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b750: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b760: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b770: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b780: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b790: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b7a0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b7b0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b7c0: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b7d0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b7e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b7f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b800: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b810: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b820: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b830: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b840: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b850: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b860: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b870: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b880: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b890: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b8a0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b8b0: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b8c0: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b8d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b8e0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b8f0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b900: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b910: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b920: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b930: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b940: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b960: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b970: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b980: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b990: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b9a0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b9b0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b9c0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b9d0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
b9e0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
b9f0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
ba00: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
ba10: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
ba20: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
ba30: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
ba40: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
ba50: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
ba60: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
ba70: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
ba80: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
ba90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
baa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bab0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bac0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bad0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bae0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
baf0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bb00: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
bb10: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
bb20: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
bb30: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
bb40: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
bb50: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
bb60: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
bb70: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bb80: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bb90: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
bba0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
bbb0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
bbc0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
bbd0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
bbe0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bbf0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
bc00: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
bc10: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
bc20: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
bc30: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
bc40: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bc50: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bc60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bc70: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bc80: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
bc90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bca0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bcb0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bcc0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bcd0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bce0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bcf0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bd00: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
bd10: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
bd20: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
bd30: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
bd40: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bd50: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bd60: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
bd70: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bd80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bd90: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
bda0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bdb0: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
bdc0: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
bdd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
bde0: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bdf0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
be00: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
be10: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
be20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
be30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
be40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
be50: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
be60: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
be70: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
be80: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
be90: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
bea0: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
beb0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
bec0: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
bed0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bee0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
bef0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
bf00: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
bf10: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
bf20: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
bf30: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
bf40: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
bf50: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bf60: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
bf70: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
bf80: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
bf90: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
bfa0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
bfb0: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
bfc0: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
bfd0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
bfe0: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
bff0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c000: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c010: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c020: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c030: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c040: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c050: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c060: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c070: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c080: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c090: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c0a0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c0b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c0c0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c0d0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c0e0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c0f0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c110: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c120: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c130: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c140: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c150: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c160: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c170: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c180: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c1b0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c1c0: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c1f0: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c200: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c220: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c230: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c240: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c250: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c260: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c270: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c280: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c290: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c2a0: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c2b0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c2c0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c2d0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c2e0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c2f0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c300: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c310: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c320: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c330: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c340: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c350: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c360: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c380: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c390: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c3a0: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c3b0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c3c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c3d0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c3e0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c3f0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c400: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c410: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c420: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c430: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c440: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c450: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c460: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c470: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c480: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c490: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c4a0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c4b0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c4c0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c4d0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c4e0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c4f0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c500: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c510: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c520: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c530: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c540: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c560: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c570: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c580: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c590: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c5a0: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c5b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c5c0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c5d0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c5e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c5f0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c600: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c610: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c620: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c630: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c640: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c650: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c660: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c670: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c680: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c690: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c6a0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c6b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c6c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c6d0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c6e0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c6f0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c700: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
c710: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
c720: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
c730: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
c740: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
c750: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
c760: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
c770: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
c780: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
c790: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
c7a0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
c7b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
c7c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
c7d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
c7e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
c7f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
c800: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
c810: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
c820: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
c830: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
c840: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c850: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
c860: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
c870: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c880: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c890: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c8a0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c8b0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c8c0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c8d0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c8e0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c8f0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c900: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c920: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
c930: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
c940: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
c950: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
c960: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
c970: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
c980: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
c990: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
c9a0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
c9b0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
c9c0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
c9d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9e0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
c9f0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
ca00: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
ca10: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
ca20: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
ca30: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
ca40: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
ca50: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
ca60: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
ca70: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
ca80: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
ca90: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
caa0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
cab0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
cac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
cad0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cae0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
caf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
cb00: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
cb10: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
cb20: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
cb30: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
cb40: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
cb50: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
cb60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
cb70: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
cb80: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
cb90: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cba0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cbb0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
cbc0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cbd0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
cbe0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cbf0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cc00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cc10: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cc20: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cc30: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cc40: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cc50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cc60: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cc70: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cc80: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cc90: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cca0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ccb0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
ccc0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
ccd0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cce0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
ccf0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cd00: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
cd10: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
cd20: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
cd30: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
cd40: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cd50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cd60: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
cd70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
cd80: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
cd90: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
cda0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cdd0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cdf0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
ce00: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
ce10: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
ce20: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
ce30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
ce40: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
ce50: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
ce60: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
ce70: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
ce80: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
ce90: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
cea0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
ceb0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ced0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
cee0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
cef0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
cf00: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
cf10: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
cf20: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
cf30: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
cf40: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
cf50: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cf60: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
cf70: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
cf80: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
cf90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
cfa0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
cfb0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
cfc0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
cfd0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
cfe0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cff0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d000: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d010: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
d020: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d030: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d040: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
d050: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d060: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d070: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d080: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d090: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0a0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d0b0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d0c0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d0d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d0e0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d0f0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d100: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d110: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d120: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d130: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d140: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d150: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d160: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d170: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d180: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d190: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d1a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d1b0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d1c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d1d0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d1e0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d1f0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d200: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d210: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d220: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d230: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d240: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d250: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d260: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d270: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d280: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d290: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d2a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d2b0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d2c0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d2d0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d2e0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d2f0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d300: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d310: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d320: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d330: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d340: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d350: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d360: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d370: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d380: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d390: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d3a0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d3d0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d3f0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d460: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d470: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d480: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d490: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d4a0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d4c0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d4d0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d4e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d4f0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d500: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d510: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d520: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d530: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d540: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d550: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d560: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d570: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d580: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d590: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d5a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d5b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d5c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d5d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d5e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d5f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d600: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d610: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d620: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d630: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d640: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d650: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d660: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d670: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d680: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d690: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d6a0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d6b0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d6c0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d6d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d6e0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d6f0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d700: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d710: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d720: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d740: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d750: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d760: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d770: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d790: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d7a0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d7b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d7d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d7e0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d7f0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d800: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d810: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d820: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d830: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d840: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d850: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d860: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d870: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d880: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d890: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d8a0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d8b0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d8c0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d8d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d8e0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d8f0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d900: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d910: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d920: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d930: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d940: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d950: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d960: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d990: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d9a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d9b0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d9c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d9d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
da00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
da10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
da20: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
da30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
da40: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
da50: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
da60: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
da70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
da80: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
da90: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
daa0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
dab0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
dac0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
dad0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
dae0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
daf0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
db00: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
db10: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
db20: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
db30: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
db40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
db50: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
db60: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
db70: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
db80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
db90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dba0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
dbb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
dbc0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
dbd0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
dbe0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
dbf0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
dc00: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
dc10: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
dc20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
dc30: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
dc40: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
dc50: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
dc60: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
dc70: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
dc80: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
dc90: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
dca0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dcb0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dcd0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
dce0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
dcf0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
dd00: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
dd10: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
dd20: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
dd30: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
dd40: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
dd50: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
dd60: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
dd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dd80: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
dd90: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
dda0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ddb0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
ddc0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
ddd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dde0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
ddf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
de00: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
de10: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
de20: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
de30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
de40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
de50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
de60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
de70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
de80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
de90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
dea0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
deb0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
dec0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
ded0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dee0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
def0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
df00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
df10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
df20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
df30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
df40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
df50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
df60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
df70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
df80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
df90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dfa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
dfc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
dfd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
dff0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e000: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e010: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e020: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e030: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e040: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e050: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e060: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e070: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e080: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e090: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e0a0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e0b0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e0c0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e0d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e0e0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e100: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e110: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e120: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e130: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e140: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e150: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e160: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e170: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e180: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e190: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e1a0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e1b0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e1e0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e1f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e200: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e220: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e230: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e240: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e250: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e260: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e270: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e280: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e290: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e2a0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e2b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e2c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e2d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e2e0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e2f0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e300: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e310: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e320: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e330: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e340: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e350: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e360: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e370: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e380: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e390: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e3a0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e3b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e3c0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e3d0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e3e0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e3f0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e400: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e410: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e420: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e430: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e440: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e450: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e460: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e470: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e480: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e490: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e4a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e4b0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e4c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e4d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e4e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e4f0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e500: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e510: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e520: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e530: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e540: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e550: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e560: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e570: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e580: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e590: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e5a0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e5b0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e5c0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e5d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e5e0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e5f0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e600: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e610: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e620: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e630: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e640: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e650: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e660: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e670: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e680: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e690: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e6a0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e6b0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e6c0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e6d0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e6e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e6f0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e700: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e710: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e720: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e730: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e740: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e750: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e760: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e770: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e780: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e790: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e7a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e7b0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e7c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e7d0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e7e0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e7f0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e800: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e810: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e820: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e830: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e850: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e860: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e880: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e890: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e8a0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e8b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e8c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e8d0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e8e0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e8f0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e900: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e910: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e920: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e930: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e940: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e950: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e960: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e970: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e980: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e990: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e9a0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e9b0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e9c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e9d0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e9e0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e9f0: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
ea00: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
ea10: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
ea20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ea30: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
ea40: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
ea50: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ea60: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ea70: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
ea80: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
ea90: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
eaa0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
eab0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
eac0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ead0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
eae0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
eaf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
eb00: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
eb10: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
eb20: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
eb30: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eb40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
eb50: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
eb60: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
eb70: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
eb80: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb90: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eba0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
ebb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
ebc0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
ebd0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
ebe0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
ebf0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
ec00: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ec10: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ec20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ec30: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ec40: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ec50: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ec60: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ec70: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ec80: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ec90: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
eca0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
ecb0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
ecc0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
ecd0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ece0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
ecf0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
ed00: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
ed10: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
ed20: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
ed30: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
ed40: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
ed50: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
ed60: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
ed70: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
ed80: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ed90: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
eda0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
edb0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
edc0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
edd0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
ede0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
edf0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
ee00: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
ee10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
ee20: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ee30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ee40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ee50: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ee60: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ee70: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ee80: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ee90: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
eea0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
eeb0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
eec0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
eed0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
eee0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
eef0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
ef00: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
ef10: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
ef20: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
ef30: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
ef40: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
ef50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
ef60: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
ef70: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
ef80: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
ef90: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
efa0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
efb0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
efc0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
efd0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
efe0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
eff0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f000: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f010: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f020: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f030: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f040: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f050: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f060: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f070: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f080: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f090: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f0a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f0b0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f0c0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f0d0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f0e0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f0f0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f100: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f110: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f120: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f130: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f140: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f150: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f160: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f170: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f180: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f1b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f1c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f1d0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f1e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f1f0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f200: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f210: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f220: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f230: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f240: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f250: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f260: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f270: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f280: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f290: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f2a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f2b0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f2c0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f2d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f2e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f2f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f300: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f310: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f320: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f330: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f340: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f350: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f360: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f370: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f380: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f390: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f3a0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f3b0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f3c0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f3d0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f3e0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f3f0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f400: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f410: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f420: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f430: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f440: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f450: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f460: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f470: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f480: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f490: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f4a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f4b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f4c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f4d0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f4e0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f4f0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f500: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f510: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f520: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f530: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f540: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f550: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f560: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f570: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f580: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f590: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f5a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f5b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f5c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f5d0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f5e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f5f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f600: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f610: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f620: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f640: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f650: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f660: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f670: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f680: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f690: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f6a0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f6b0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f6c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f6e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f6f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f700: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f710: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f720: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f730: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f750: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f760: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f770: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f780: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f790: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f7a0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f7b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f7c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f7d0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f7e0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f7f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f800: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f820: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f830: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f840: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f850: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f870: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f880: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f890: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f8a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f8b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f8d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f8e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f8f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f900: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f920: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f930: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f940: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f950: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f960: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f970: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f980: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f990: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f9a0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f9b0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f9c0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f9d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f9e0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f9f0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
fa00: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
fa10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
fa20: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
fa30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fa40: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
fa50: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fa60: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fa70: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fa80: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fa90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
faa0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fab0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fac0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fad0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fae0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
faf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb00: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fb10: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fb20: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fb30: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fb40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
fb50: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fb60: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fb70: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fb80: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fb90: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fba0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fbb0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
fbc0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fbd0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fbe0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fbf0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fc00: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fc10: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fc20: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
fc30: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc40: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc60: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
fc70: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
fc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fca0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fcb0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
fcc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
fcd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
fce0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fcf0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fd00: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fd20: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fd30: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fd40: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
fd50: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
fd60: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
fd70: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fd80: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
fd90: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
fda0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fdb0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
fdc0: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
fdd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
fde0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdf0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe00: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fe10: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fe20: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fe30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fe40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fe50: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fe60: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fe70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fe80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fe90: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
fea0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
feb0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fec0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fed0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fee0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
fef0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
ff00: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
ff10: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
ff20: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
ff30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
ff40: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
ff50: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
ff60: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
ff70: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
ff80: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
ff90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
ffa0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ffb0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
ffc0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
ffd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
ffe0: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fff0: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10000 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10010 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10020 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10030 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10040 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10050 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10060 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10070 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10080 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10090 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
100a0 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
100b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
100c0 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
100f0 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10100 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10110 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10120 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10130 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10140 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10150 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10160 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10170 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10180 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10190 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
101a0 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
101b0 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
101c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
101d0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
101e0 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
101f0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10200 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10210 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10220 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10230 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10240 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10250 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10260 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10280 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
102a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
102b0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
102c0 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
102d0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
102e0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
102f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10300 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10310 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10320 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10330 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10340 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10350 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10360 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10370 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10380 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10390 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
103a0 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
103b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
103c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
103d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
103e0 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
103f0 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10400 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10410 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10420 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10430 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10440 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10450 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10460 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10470 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10480 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10490 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
104a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
104b0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
104c0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
104d0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
104e0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
104f0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10500 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10510 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10520 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10530 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10540 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10550 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10560 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10570 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10590 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
105a0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
105b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
105c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
105d0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
105e0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
105f0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10600 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10610 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10620 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10630 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10640 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10650 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10660 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10670 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10680 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10690 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
106a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
106b0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
106c0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
106d0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
106e0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
106f0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10700 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10710 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10720 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10730 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10740 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10750 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10760 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10770 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10780 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10790 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
107b0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
107c0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
107d0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10800 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10810 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10820 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10830 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10840 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10850 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10860 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10870 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10880 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10890 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
108a0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
108b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
108c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
108d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
108e0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
108f0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10900 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10910 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10920 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10950 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10970 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10980 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10990 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
109a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
109b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
109c0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
109d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
109e0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10a10 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10a20 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10a40 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10a50 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10a60 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10a70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10a80 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10a90 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10aa0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10ab0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10ac0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10ad0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10ae0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10af0 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
10b00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
10b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10b30 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10b40 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
10b50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10b60 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10b70 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10b80 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10b90 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10ba0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10bb0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10bc0 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10bd0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10be0 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10bf0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10c00 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10c10 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10c20 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10c30 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10c40 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10c50 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10c60 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10c70 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10c80 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10c90 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ca0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10cb0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10cc0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10cd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10ce0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10cf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10d00 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10d10 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10d20 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10d30 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10d40 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10d50 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10d60 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10d70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10d80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10d90 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10da0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10db0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10dc0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10dd0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10de0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10df0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10e00 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10e10 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10e20 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10e30 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10e40 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10e50 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10e60 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10e70 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10e80 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10e90 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ea0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10eb0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ec0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10ed0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10ee0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10ef0 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10f00 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10f10 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10f20 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10f30 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10f40 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10f50 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10f60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10f80 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10f90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10fa0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10fb0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10fc0 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10fd0 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10fe0 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10ff0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11000 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11010 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
11020 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
11030 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
11040 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
11050 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
11060 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
11070 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
11080 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
11090 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
110a0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
110b0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
110c0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
110d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
110e0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
110f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
11100 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
11110 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
11120 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
11130 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
11140 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
11150 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
11160 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
11170 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
11180 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
11190 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
111a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
111b0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
111c0 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
111d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
111e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
111f0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11200 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11210 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11230 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
11240 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
11250 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
11260 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
11270 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
11280 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
11290 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
112a0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
112b0 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
112c0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
112d0 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
112e0 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
112f0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11300 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 30  {.  PgHdr *p = 0
11310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11320 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11330 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
11340 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11350 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
11360 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
11370 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
11380 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
11390 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
113a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
113b0 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
113c0 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
113d0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
113e0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
113f0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11400 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
11410 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
11420 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11430 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11440 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
11450 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
11460 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
11470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11480 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11490 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
114a0 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
114b0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
114c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
114d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
114e0 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
114f0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11500 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11510 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11520 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11530 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11540 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11550 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11560 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11570 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11580 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11590 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
115a0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
115b0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
115c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
115d0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
115e0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
115f0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11600 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11610 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11620 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11630 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11640 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11650 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11660 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11670 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11680 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11690 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
116a0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
116b0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
116c0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
116d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
116e0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
116f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11700 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11710 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11720 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11730 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11740 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11750 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11760 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11770 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11780 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11790 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
117a0 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
117b0 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
117c0 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
117d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
117e0 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
117f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11800 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11810 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11820 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11830 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
11840 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11850 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
11860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11870 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11880 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
118a0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
118b0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
118c0 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
118d0 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
118e0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
118f0 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11900 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11910 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11920 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11930 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
11940 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11950 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
11960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11970 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11980 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
119a0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
119b0 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
119c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
119d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
119e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
119f0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11a00 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11a10 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
11a20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
11a30 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
11a40 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11a50 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
11a60 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11a70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11a80 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11a90 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11ab0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11ac0 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11ad0 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11ae0 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11af0 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11b00 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11b10 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11b20 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11b30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11b40 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11b50 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
11b60 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11b70 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11b80 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11b90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11ba0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11bb0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11bc0 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11bd0 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11be0 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11bf0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11c00 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11c10 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11c20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11c30 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11c40 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11c50 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11c60 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11c70 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11c80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11c90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11ca0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11cb0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11cc0 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11cd0 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11ce0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11d00 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11d10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11d20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11d30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11d40 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d60 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11d70 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11d80 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11d90 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11da0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11db0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11dc0 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11dd0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11de0 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11df0 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11e00 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11e10 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11e20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11e30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11e40 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11e50 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11e60 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11e70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11e80 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11e90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11ea0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11eb0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11ec0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11ee0 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11ef0 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11f00 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11f10 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11f20 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11f30 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11f40 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11f50 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11f60 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11f70 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11f80 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11f90 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11fa0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11fb0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11fc0 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11fd0 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11fe0 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11ff0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
12000 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
12010 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
12020 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
12030 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
12040 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
12050 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12060 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
12070 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12090 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
120a0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
120b0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
120c0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
120d0 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
120e0 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
120f0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12100 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
12110 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12120 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12130 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
12140 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
12150 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12160 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
12170 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12180 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12190 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
121a0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
121b0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
121c0 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
121d0 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
121e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
121f0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12200 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12210 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12220 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12230 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12240 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12250 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12260 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12270 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12280 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12290 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
122a0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
122b0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
122c0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
122d0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
122e0 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
122f0 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12310 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12320 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12340 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12350 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12360 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12370 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12380 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12390 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
123a0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
123b0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
123c0 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
123d0 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
123e0 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
123f0 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12400 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12410 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12420 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12430 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12440 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12450 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12460 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12480 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12490 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
124a0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
124b0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
124c0 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
124d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
124e0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
124f0 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12500 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12510 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12520 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12530 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12540 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12550 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12560 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12570 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12580 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12590 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
125a0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
125b0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
125c0 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
125d0 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
125e0 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
125f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12600 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12610 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
12620 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
12630 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12640 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12650 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
12660 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12670 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12680 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12690 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
126a0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
126b0 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
126c0 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
126d0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
126e0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
126f0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
12700 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
12710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12720 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
12730 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
12740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12750 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12760 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12770 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12780 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12790 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
127a0 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
127b0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
127c0 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
127d0 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
127e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
127f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
12800 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
12810 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
12820 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
12830 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
12840 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12850 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12860 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12870 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12880 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12890 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
128a0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
128b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
128c0 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
128d0 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
128e0 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
128f0 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
12900 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
12910 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
12920 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
12930 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
12940 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12950 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12960 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12970 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12980 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12990 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
129a0 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
129b0 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
129c0 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
129d0 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
129e0 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
129f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12a00 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12a10 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
12a20 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
12a30 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
12a40 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12a50 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12a60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12a70 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12a80 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12a90 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12aa0 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12ab0 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12ac0 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12ad0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12ae0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12af0 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12b00 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12b10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12b20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12b30 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12b40 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12b50 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12b60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12b70 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12b80 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12b90 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12ba0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12bb0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12bc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12bd0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12be0 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12bf0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12c00 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
12c10 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
12c20 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
12c30 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
12c40 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12c50 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12c60 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12c70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c80 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12c90 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12ca0 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12cb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
12cc0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
12cd0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
12ce0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
12cf0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
12d00 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
12d10 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
12d20 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
12d30 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
12d40 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
12d50 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
12d60 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
12d70 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
12d80 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
12d90 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
12da0 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
12db0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12dc0 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
12dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12de0 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
12df0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
12e00 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
12e10 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
12e20 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
12e30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12e40 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
12e50 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
12e60 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
12e70 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
12e80 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
12e90 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
12ea0 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
12eb0 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
12ec0 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
12ed0 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
12ee0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
12ef0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
12f00 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
12f10 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
12f20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12f30 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
12f40 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
12f50 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
12f60 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
12f70 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
12f80 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12f90 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
12fa0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
12fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
12fc0 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
12fd0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
12fe0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
12ff0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
13000 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
13010 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
13020 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
13030 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
13040 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13050 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13060 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13070 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13080 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13090 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
130a0 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
130b0 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
130c0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
130d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
130e0 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
130f0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
13100 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
13110 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
13120 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
13130 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
13140 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13150 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13160 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13170 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13180 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13190 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
131a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
131b0 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
131c0 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
131d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
131e0 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
131f0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
13200 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
13210 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
13220 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
13230 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
13240 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13250 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13260 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13270 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13280 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13290 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
132a0 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
132b0 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
132c0 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
132d0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
132e0 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
132f0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
13300 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13310 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
13320 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
13330 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
13340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13350 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13360 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13370 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13380 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13390 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
133a0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
133b0 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
133c0 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
133d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
133e0 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
133f0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
13400 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
13410 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
13420 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
13430 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
13440 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
13450 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
13460 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13470 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13480 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13490 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
134a0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
134b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
134c0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
134d0 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
134e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
134f0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
13500 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
13510 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
13520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13530 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
13540 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
13550 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
13560 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13570 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13580 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13590 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
135a0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
135b0 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
135c0 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
135d0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
135e0 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
135f0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13600 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
13610 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
13620 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
13630 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
13640 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13650 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13660 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13670 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13680 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13690 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
136a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
136b0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
136c0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
136d0 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
136e0 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
136f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13700 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
13710 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
13720 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
13730 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
13740 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13750 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13760 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13770 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13780 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13790 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
137a0 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
137b0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
137c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
137d0 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
137e0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
137f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
13800 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
13810 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
13820 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
13830 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
13840 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13850 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13860 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13870 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13880 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13890 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
138a0 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
138b0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
138c0 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
138d0 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
138e0 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
138f0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
13900 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
13910 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
13920 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
13930 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
13940 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13950 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13960 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13970 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13980 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13990 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
139a0 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
139b0 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
139c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
139d0 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
139e0 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
139f0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
13a00 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
13a10 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
13a20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
13a30 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
13a40 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13a50 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13a70 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13a80 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13a90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13aa0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13ab0 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13ac0 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13ad0 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13af0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13b00 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13b10 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13b20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13b30 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13b40 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13b50 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13b60 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
13b70 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
13b80 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
13b90 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
13bb0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13bc0 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
13bd0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13be0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13bf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13c00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13c10 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
13c20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13c30 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13c40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13c50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13c60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13c70 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13c80 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13ce0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13cf0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
13d00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13d10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13d20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13d30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13d40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13d50 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13d60 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13d70 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13d90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13da0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13db0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13dc0 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13dd0 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13de0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13df0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13e10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
13e20 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
13e30 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
13e40 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
13e50 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
13e60 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
13e70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
13e80 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
13e90 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
13ea0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
13eb0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
13ec0 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
13ed0 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
13ee0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
13ef0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
13f00 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
13f10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
13f20 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  nal. .      */. 
13f30 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
13f40 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d   = (!pPager->tem
13f50 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  pFile && sqlite3
13f60 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50  JournalExists(pP
13f70 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20  ager->jfd));.   
13f80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13f90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13fa0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13fb0 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
13fc0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
13fd0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13fe0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
13ff0 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14000 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14010 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14020 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14030 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14040 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
14050 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
14060 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
14070 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14080 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
14090 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
140a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
140b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
140c0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
140d0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
140e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
140f0 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14100 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14110 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14120 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14130 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14140 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
14150 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
14160 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
14170 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f  dr *p = pager_lo
14180 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
14190 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
141a0 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20      p->pageHash 
141b0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
141c0 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
141d0 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ull(p);.    }.  
141e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
141f0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
14200 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
14210 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
14220 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
14230 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
14240 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
14250 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
14260 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
14270 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
14280 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
14290 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
142a0 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70  bSize);..  if( p
142b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
142c0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f  r) ){.    /* Dro
142d0 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d  p the WAL write-
142e0 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c  lock, if any. Al
142f0 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65  so, if the conne
14300 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20  ction was in .  
14310 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64    ** locking_mod
14320 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
14330 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   but is no longe
14340 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c  r, drop the EXCL
14350 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f  USIVE .    ** lo
14360 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  ck held on the d
14370 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
14380 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73    */.    rc2 = s
14390 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74  qlite3WalEndWrit
143a0 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
143b0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
143c0 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c  assert( rc2==SQL
143d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73  ITE_OK );.  }els
143e0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
143f0 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14400 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  & pPager->dbFile
14410 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53  Size>pPager->dbS
14420 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ize ){.    /* Th
14430 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
14440 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  en when committi
14450 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
14460 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75   in rollback-jou
14470 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rnal.    ** mode
14480 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
14490 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
144a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
144b0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
144c0 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20  .    ** At this 
144d0 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  point the journa
144e0 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  l has been final
144f0 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61  ized and the tra
14500 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  nsaction .    **
14510 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
14520 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65  mmitted, but the
14530 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
14540 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
14550 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65   the.    ** file
14560 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20  . So it is safe 
14570 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
14580 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
14590 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   its minimum.   
145a0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a   ** required siz
145b0 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
145c0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
145d0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
145e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
145f0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14600 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
14610 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ze);.  }..  if( 
14620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14630 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70   bCommit && isOp
14640 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
14650 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14660 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
14670 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
14680 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f  TE_FCNTL_COMMIT_
14690 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20  PHASETWO, 0);.  
146a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
146b0 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
146c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
146d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
146e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
146f0 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57    && (!pagerUseW
14700 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71  al(pPager) || sq
14710 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
14720 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
14730 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20  al, 0)).  ){.   
14740 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f   rc2 = pagerUnlo
14750 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
14760 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
14770 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
14780 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
14790 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
147a0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
147b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
147c0 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74  ster = 0;..  ret
147d0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
147e0 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
147f0 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
14800 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
14810 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14820 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
14830 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
14840 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
14850 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
14860 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
14870 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f   ERROR state, do
14880 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
14890 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
148a0 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
148b0 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
148c0 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
148d0 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
148e0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
148f0 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
14900 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
14910 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
14920 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
14930 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61  ove the pager ba
14940 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
14950 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65  . If this .** me
14960 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
14970 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
14980 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
14990 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
149a0 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  t .** connection
149b0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
149c0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
149d0 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
149e0 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a   be this one) .*
149f0 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62  * will roll it b
14a00 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
14a10 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
14a20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
14a30 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
14a40 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
14a50 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
14a60 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
14a70 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
14a80 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
14a90 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
14aa0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
14ab0 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63  RROR state. Whic
14ac0 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
14ad0 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
14ae0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14af0 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
14b00 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
14b10 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
14b20 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
14b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14b40 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14b50 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
14b60 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
14b70 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e!=PAGER_OPEN ){
14b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
14b90 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
14ba0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69  pPager) );.    i
14bb0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
14bc0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
14bd0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
14be0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
14bf0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
14c00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
14c10 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
14c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
14c30 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14c40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
14c50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14c60 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Mode ){.      as
14c70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
14c80 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
14c90 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ER );.      page
14ca0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
14cb0 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  n(pPager, 0, 0);
14cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
14cd0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
14ce0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
14cf0 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
14d00 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14d10 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
14d20 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
14d30 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
14d40 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
14d50 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
14d60 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
14d70 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
14d80 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14d90 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14da0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14db0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14dc0 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
14dd0 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
14de0 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
14df0 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
14e00 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
14e10 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14e20 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
14e30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
14e40 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
14e50 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
14e60 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
14e70 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
14e80 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14e90 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14ea0 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14eb0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
14ec0 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
14ed0 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
14ee0 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
14ef0 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
14f00 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
14f10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14f20 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
14f30 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
14f40 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
14f50 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
14f60 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
14f70 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
14f80 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14f90 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14fa0 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14fb0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
14fc0 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
14fd0 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
14fe0 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
14ff0 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
15000 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
15010 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
15020 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
15030 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
15040 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
15050 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
15060 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
15070 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
15080 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
15090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
150a0 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
150b0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
150c0 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
150d0 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
150e0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
150f0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
15100 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
15110 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
15120 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
15130 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
15140 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15150 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
15160 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
15170 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
15180 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
15190 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
151a0 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
151b0 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
151c0 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
151d0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
151e0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
151f0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
15200 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
15210 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
15220 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
15230 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
15240 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
15250 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
15260 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15270 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
15280 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
15290 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
152c0 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
152d0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
152e0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
152f0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
15300 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
15310 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
15320 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
15330 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
15340 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
15350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
15360 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
15370 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
15380 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
15390 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
153a0 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
153b0 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
153c0 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
153d0 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
153e0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
153f0 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
15400 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
15410 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
15420 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
15430 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
15440 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
15450 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
15460 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
15470 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
15480 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
15490 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
154a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
154b0 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
154c0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
154d0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
154e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
154f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15500 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
15510 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
15520 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
15530 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
15540 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
15550 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
15560 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
15570 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
15580 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
15590 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
155a0 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
155b0 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
155c0 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
155d0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
155e0 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
155f0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
15600 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
15610 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
15620 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
15630 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
15640 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
15650 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
15660 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
15670 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
15680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15690 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
156a0 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
156b0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
156c0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
156d0 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
156e0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
156f0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
15700 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
15710 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
15720 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
15730 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15740 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
15750 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
15760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15770 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
15780 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15790 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
157a0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
157b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
157c0 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
157d0 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
157e0 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
157f0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
15800 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
15810 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
15820 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
15830 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
15840 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
15850 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
15860 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
15870 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
15880 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
15890 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
158a0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
158b0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
158c0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
158d0 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
158e0 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
158f0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
15900 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
15910 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
15920 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
15930 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
15940 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
15950 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
15960 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
15970 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15980 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
15990 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
159a0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
159b0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
159c0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
159d0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
159e0 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
159f0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
15a00 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
15a10 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15a20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
15a30 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
15a40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a60 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
15a70 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15a80 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15aa0 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
15ab0 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
15ac0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
15ad0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15ae0 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
15af0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
15b00 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
15b10 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
15b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
15b30 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
15b40 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
15b50 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
15b60 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
15b70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
15b80 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
15b90 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
15ba0 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
15bb0 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
15bc0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
15bd0 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
15be0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
15bf0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
15c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15c10 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15c20 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
15c30 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
15c40 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
15c50 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15c60 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
15c70 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
15c80 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ca0 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
15cb0 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
15cc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
15cd0 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
15ce0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
15cf0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
15d00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15d10 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
15d20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15d30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
15d40 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
15d50 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
15d60 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
15d70 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
15d80 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
15d90 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15da0 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
15db0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
15dc0 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
15dd0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
15de0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
15df0 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
15e00 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
15e10 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
15e20 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
15e30 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
15e40 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
15e50 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
15e60 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
15e70 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
15e80 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15e90 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
15ea0 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
15eb0 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
15ec0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
15ed0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
15ee0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
15ef0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
15f00 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
15f10 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
15f20 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
15f30 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
15f40 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
15f50 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
15f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15f70 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
15f80 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
15f90 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
15fa0 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
15fb0 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
15fc0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15fd0 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
15fe0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15ff0 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
16000 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
16010 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
16020 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16030 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
16040 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
16050 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
16060 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
16070 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
16080 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
16090 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
160a0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
160b0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
160c0 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
160d0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
160e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
160f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
16100 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
16110 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16120 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16130 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
16140 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
16150 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16160 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
16170 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
16180 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
16190 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
161a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
161b0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
161c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
161d0 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
161e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
161f0 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
16200 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
16210 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16220 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
16230 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16240 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16250 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
16260 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
16270 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
16280 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
16290 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
162a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
162b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
162c0 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
162d0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
162e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
162f0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
16300 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
16310 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
16320 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
16330 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
16340 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
16350 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
16360 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
16370 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
16380 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
16390 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
163a0 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
163b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
163c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
163d0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
163e0 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
163f0 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
16400 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
16410 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
16420 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
16430 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
16440 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
16450 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
16460 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
16470 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
16490 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
164a0 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
164b0 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
164c0 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
164d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
164e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
164f0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
16500 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16510 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
16520 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
16530 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16540 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
16550 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
16560 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
16570 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
16580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16590 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
165a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
165b0 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
165c0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
165d0 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
165e0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
165f0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
16600 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
16610 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
16620 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
16630 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
16640 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
16650 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
16660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16670 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
16680 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
16690 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
166a0 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
166b0 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
166c0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
166d0 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
166e0 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
166f0 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
16700 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
16710 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
16720 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
16730 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
16740 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
16750 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
16760 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
16770 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
16780 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16790 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
167a0 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
167b0 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
167c0 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
167d0 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
167e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
167f0 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
16800 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
16810 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16820 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
16830 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
16840 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
16850 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
16860 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
16870 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
16880 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
16890 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
168a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
168b0 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
168c0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
168d0 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
168e0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
168f0 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
16900 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
16910 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
16920 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
16930 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
16940 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
16950 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
16960 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
16970 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
16980 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
16990 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
169a0 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
169b0 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
169c0 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
169d0 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
169e0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
169f0 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
16a00 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
16a10 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
16a20 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
16a30 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
16a40 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
16a50 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
16a60 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
16a70 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
16a80 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16a90 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
16aa0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16ab0 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
16ac0 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
16ad0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
16ae0 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
16af0 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
16b00 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
16b10 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
16b20 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
16b30 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
16b40 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
16b50 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16b60 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16b70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16b80 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16b90 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16ba0 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16bb0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
16bc0 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
16bd0 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
16be0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
16bf0 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
16c00 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
16c10 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
16c20 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
16c30 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
16c40 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
16c50 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
16c60 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
16c70 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
16c80 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16c90 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16ca0 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16cb0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
16cc0 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
16cd0 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
16ce0 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
16cf0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16d00 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
16d10 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
16d20 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16d30 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
16d40 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16d50 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
16d60 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
16d70 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
16d80 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
16d90 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
16da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
16db0 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
16dc0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
16dd0 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
16de0 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
16df0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
16e00 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
16e10 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
16e20 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
16e30 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
16e40 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16e50 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
16e60 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
16e70 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
16e80 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
16e90 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
16ea0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
16eb0 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
16ec0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
16ed0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
16ee0 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
16ef0 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
16f00 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
16f10 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
16f20 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
16f30 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
16f40 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
16f50 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
16f60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
16f70 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
16f80 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
16f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
16fa0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16fb0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
16fc0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
16fd0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
16fe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16ff0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
17000 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
17010 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
17020 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
17030 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
17040 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17050 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
17060 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
17070 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
17080 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
17090 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
170a0 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
170b0 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
170c0 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
170d0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
170e0 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
170f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
17100 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
17110 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
17120 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
17130 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
17140 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
17150 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
17160 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
17170 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
17180 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
17190 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
171a0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
171b0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
171c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
171d0 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
171e0 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
171f0 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
17200 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
17210 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
17220 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
17230 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
17240 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
17250 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
17260 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
17270 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
17280 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
17290 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
172a0 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44  er->fd, (u8 *)aD
172b0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
172c0 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
172d0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
172e0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
172f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
17300 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
17310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17320 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
17330 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
17340 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
17350 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17360 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
17370 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
17380 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
17390 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
173a0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
173b0 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
173c0 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
173d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
173e0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
173f0 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
17400 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
17410 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17420 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
17430 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
17440 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
17450 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
17460 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
17470 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
17480 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
17490 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
174a0 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
174b0 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
174c0 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
174d0 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
174e0 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
174f0 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
17500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17510 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
17520 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
17530 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
17540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
17550 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
17560 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
17570 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
17580 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
17590 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
175a0 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
175b0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
175c0 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
175d0 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
175e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
175f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
17600 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17610 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
17620 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
17630 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
17640 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
17650 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
17660 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
17670 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
17680 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
17690 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
176a0 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
176b0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
176c0 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
176d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
176e0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
176f0 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
17700 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
17710 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
17720 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
17730 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
17740 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
17750 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
17760 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
17770 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
17780 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
17790 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
177a0 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
177b0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
177c0 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b  _ROLLBACK)==0 );
177d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
177e0 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
177f0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
17800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17810 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
17820 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
17830 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
17840 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
17850 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
17860 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
17870 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17880 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
17890 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
178a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
178b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
178c0 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
178d0 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
178e0 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
178f0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17900 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17910 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17920 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17930 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
17940 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
17950 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
17960 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
17970 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
17980 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
17990 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
179a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
179b0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
179c0 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
179d0 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
179e0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
179f0 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17a00 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17a10 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17a20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17a30 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
17a40 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
17a50 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
17a60 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
17a70 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
17a80 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
17a90 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17aa0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17ab0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17ac0 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17ad0 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17ae0 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17af0 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17b00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17b10 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17b20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17b30 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
17b40 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
17b50 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
17b60 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
17b70 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
17b80 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
17b90 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17ba0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17bb0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17bc0 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17bd0 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17be0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17bf0 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17c00 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17c10 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17c20 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17c30 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
17c40 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
17c50 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
17c60 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
17c70 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
17c80 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
17c90 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17ca0 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17cb0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17cc0 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17cd0 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17ce0 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17cf0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17d00 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17d10 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17d20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17d30 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
17d40 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
17d50 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
17d60 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
17d70 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
17d80 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
17d90 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17da0 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17db0 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17dc0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17de0 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17df0 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17e00 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17e10 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17e20 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17e30 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
17e40 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
17e50 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
17e60 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
17e70 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
17e80 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
17e90 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17ea0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17eb0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17ec0 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
17ed0 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
17ee0 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
17ef0 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
17f00 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
17f10 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
17f20 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
17f30 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
17f40 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
17f50 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
17f60 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
17f70 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
17f80 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
17f90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17fa0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17fb0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
17fd0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
17fe0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
17ff0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
18000 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
18010 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
18020 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
18030 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
18040 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
18050 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
18060 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
18070 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
18080 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
18090 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
180a0 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
180b0 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
180c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
180d0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
180e0 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
180f0 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
18100 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
18110 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
18120 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
18130 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
18140 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
18150 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18160 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
18170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18180 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
18190 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
181a0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
181b0 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
181c0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
181d0 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
181e0 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
181f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
18200 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
18210 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
18220 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
18230 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
18240 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
18250 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18260 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
18270 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
18280 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
18290 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
182a0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
182b0 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
182c0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
182d0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
182e0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
182f0 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
18300 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18310 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
18320 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
18330 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
18340 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
18350 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
18360 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
18370 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
18380 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
18390 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
183a0 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
183b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
183c0 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
183d0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
183e0 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
183f0 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
18400 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
18410 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
18420 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
18430 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
18440 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
18450 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
18460 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
18470 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
18480 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
18490 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
184a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
184b0 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
184c0 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
184d0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
184e0 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
184f0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
18500 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18510 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
18520 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
18530 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
18540 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
18550 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
18560 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
18570 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
18580 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
18590 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
185a0 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
185b0 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
185c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
185d0 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
185e0 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
185f0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
18600 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
18610 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
18620 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
18630 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
18640 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
18650 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
18660 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
18670 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
18680 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
18690 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
186a0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
186b0 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
186c0 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
186d0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
186e0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
186f0 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
18700 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
18710 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
18720 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
18730 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
18740 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
18750 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
18760 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
18770 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
18780 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
18790 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
187a0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
187b0 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
187c0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
187d0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
187e0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
187f0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
18800 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
18810 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
18820 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18830 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
18840 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
18850 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
18860 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
18870 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
18880 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
18890 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
188a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
188b0 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
188c0 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
188d0 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
188e0 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
188f0 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18900 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18910 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18920 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18930 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
18940 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
18950 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
18960 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
18970 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18990 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
189a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
189b0 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
189c0 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
189d0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
189e0 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
189f0 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18a00 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18a10 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18a20 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18a30 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
18a40 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
18a50 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
18a60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
18a70 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
18a80 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
18a90 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18aa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18ab0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18ac0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18ad0 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18ae0 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18af0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18b00 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18b10 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18b20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18b30 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
18b40 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
18b50 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
18b60 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
18b70 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
18b80 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
18b90 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18ba0 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18bb0 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18bc0 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18bd0 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18be0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18bf0 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18c10 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18c20 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18c30 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
18c40 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
18c50 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
18c60 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
18c70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
18c80 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
18c90 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18ca0 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18cb0 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18cc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18cd0 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18ce0 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
18cf0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18d00 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18d10 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
18d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18d30 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
18d40 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
18d50 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
18d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18d70 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
18d80 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
18d90 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
18da0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18db0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
18dc0 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
18dd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
18de0 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
18df0 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
18e00 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
18e10 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
18e20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
18e30 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
18e40 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
18e50 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
18e60 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
18e70 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
18e80 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
18e90 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18ea0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
18eb0 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
18ec0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
18ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18ee0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18ef0 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
18f00 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
18f10 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
18f20 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
18f30 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
18f40 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
18f50 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
18f60 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
18f70 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
18f80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18f90 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18fa0 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
18fb0 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
18fc0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
18fd0 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
18fe0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
18ff0 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
19000 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
19010 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
19020 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19030 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19040 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
19050 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
19060 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
19070 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
19080 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
19090 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
190a0 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
190b0 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
190c0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
190d0 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
190e0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
190f0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
19100 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
19110 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
19120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19140 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
19160 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
19170 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
19180 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
19190 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
191a0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
191b0 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
191c0 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
191d0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
191e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
191f0 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
19200 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
19210 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
19220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
19230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
19240 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
19250 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19260 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19270 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
19280 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
19290 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
192a0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
192b0 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
192c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
192d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
192e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
192f0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19300 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
19310 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
19320 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
19330 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
19340 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
19350 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
19360 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
19370 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19380 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19390 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
193a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
193b0 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
193c0 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
193d0 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
193e0 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
193f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
19400 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
19410 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
19420 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19430 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
19440 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19450 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19460 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
19470 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
19480 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
19490 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
194a0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
194b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
194c0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
194d0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
194e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
194f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
19500 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19510 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
19520 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19530 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
19540 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19550 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
19560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
19570 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
19580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
19590 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
195a0 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
195b0 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
195c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
195d0 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
195e0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
195f0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
19600 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
19610 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
19620 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
19630 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
19640 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
19650 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
19660 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
19670 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
19680 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
19690 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
196a0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
196b0 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
196c0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
196d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
196e0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
196f0 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
19700 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
19710 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
19720 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
19730 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
19740 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
19750 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
19760 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
19770 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
19780 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
19790 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
197a0 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
197b0 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
197c0 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68  r, it might migh
197d0 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
197e0 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  at the file on d
197f0 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  isk is smaller t
19800 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61  han .** nPage pa
19810 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74  ges. Some operat
19820 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65  ing system imple
19830 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67  mentations can g
19840 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a  et confused if .
19850 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72  ** you try to tr
19860 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
19870 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
19880 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
19890 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  t .** currently 
198a0 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68  is, so detect th
198b0 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
198c0 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
198d0 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20  byte to .** the 
198e0 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66  end of the new f
198f0 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ile instead..**.
19900 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
19910 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19920 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  OK. If an IO err
19930 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
19940 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65  modifying.** the
19950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
19960 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
19970 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
19980 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
19990 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
199a0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
199b0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
199c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
199d0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
199e0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
199f0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
19a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19a10 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41  State!=PAGER_REA
19a20 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20  DER );.  .  if( 
19a30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
19a40 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  d) .   && (pPage
19a50 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
19a60 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
19a70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
19a80 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20  =PAGER_OPEN) .  
19a90 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
19aa0 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
19ab0 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
19ac0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
19ad0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
19ae0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
19af0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
19b00 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
19b10 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
19b20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
19b30 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
19b40 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
19b50 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
19b60 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
19b70 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a      newSize = sz
19b80 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Page*(i64)nPage;
19b90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19ba0 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
19bb0 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
19bc0 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
19bd0 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
19be0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19bf0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
19c00 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
19c10 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
19c20 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74  lse if( (current
19c30 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65  Size+szPage)<=ne
19c40 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
19c50 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50   char *pTmp = pP
19c60 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
19c70 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
19c80 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29  pTmp, 0, szPage)
19c90 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19ca0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
19cb0 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53  age) == currentS
19cc0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ize );.        t
19cd0 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
19ce0 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72  e-szPage) >  cur
19cf0 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
19d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19d10 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
19d20 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65  fd, pTmp, szPage
19d30 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65  , newSize-szPage
19d40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19d50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
19d70 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
19d80 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
19d90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
19da0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19db0 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74  * Return a sanit
19dc0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
19dd0 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
19de0 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65  of OS file pFile
19df0 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  . The.** return 
19e00 76 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74  value is guarant
19e10 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65  eed to lie betwe
19e20 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45  en 32 and MAX_SE
19e30 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e  CTOR_SIZE..*/.in
19e40 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  t sqlite3SectorS
19e50 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
19e60 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
19e70 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73  iRet = sqlite3Os
19e80 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65  SectorSize(pFile
19e90 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32  );.  if( iRet<32
19ea0 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35   ){.    iRet = 5
19eb0 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  12;.  }else if( 
19ec0 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  iRet>MAX_SECTOR_
19ed0 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
19ee0 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
19ef0 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
19f00 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f  iRet = MAX_SECTO
19f10 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65  R_SIZE;.  }.  re
19f20 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn iRet;.}../*
19f30 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
19f40 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73  e of the Pager.s
19f50 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
19f60 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  le for the given
19f70 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20  .** pager based 
19f80 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  on the value ret
19f90 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
19fa0 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a  ctorSize method.
19fb0 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64  ** of the open d
19fc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
19fd0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
19fe0 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20  ll be used used 
19ff0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1a000 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1a010 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1a020 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1a030 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1a040 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1a050 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1a060 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1a070 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a080 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1a090 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1a0a0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1a0b0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1a0c0 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1a0d0 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1a0e0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a0f0 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1a100 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1a110 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1a120 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1a130 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1a140 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1a150 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1a160 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1a170 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1a180 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1a190 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a1a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1a1b0 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1a1c0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1a1d0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1a1e0 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1a1f0 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1a200 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1a210 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1a220 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1a230 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1a240 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1a250 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1a260 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1a270 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1a280 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1a290 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1a2a0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1a2b0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1a2c0 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1a2d0 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1a2e0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1a2f0 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1a300 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1a310 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1a320 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1a330 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1a340 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1a350 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1a360 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1a370 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1a380 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1a390 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1a3a0 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1a3b0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a3c0 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1a3d0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1a3e0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1a3f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a400 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1a410 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1a420 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a430 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1a440 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1a450 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1a460 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1a470 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1a480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1a490 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1a4a0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1a4b0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1a4c0 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1a4d0 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1a4e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1a4f0 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1a500 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1a510 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1a520 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1a530 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1a540 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1a550 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1a560 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1a570 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1a580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1a590 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a5a0 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1a5b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1a5c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1a5d0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1a5e0 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1a5f0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1a600 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1a610 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1a620 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1a630 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1a640 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1a650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1a660 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1a670 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1a680 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1a690 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1a6a0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1a6b0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1a6c0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1a6d0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1a6e0 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1a6f0 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1a700 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1a710 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1a720 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1a730 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1a740 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1a750 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1a760 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1a770 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1a780 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a790 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a7a0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1a7b0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1a7c0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1a7d0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1a7e0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1a7f0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1a800 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1a810 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1a820 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1a830 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1a840 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1a850 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1a860 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a870 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1a880 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1a890 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1a8a0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1a8b0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1a8c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a8d0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a8e0 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1a8f0 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1a900 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1a910 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1a920 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1a930 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1a940 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1a950 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1a960 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1a970 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1a980 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1a990 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1a9a0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1a9b0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1a9c0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1a9d0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1a9e0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1a9f0 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1aa00 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1aa10 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1aa20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1aa30 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1aa40 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1aa50 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1aa60 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1aa70 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1aa80 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1aa90 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1aaa0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1aab0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1aac0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1aad0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1aae0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1aaf0 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1ab00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1ab10 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1ab20 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1ab30 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1ab40 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1ab50 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1ab60 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1ab70 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1ab80 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1ab90 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1aba0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1abb0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1abc0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1abd0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1abe0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1abf0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1ac00 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1ac10 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1ac20 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1ac30 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1ac40 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1ac50 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1ac60 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1ac70 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1ac80 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1ac90 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1aca0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1acb0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1acc0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1acd0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1ace0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1acf0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1ad00 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1ad10 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1ad20 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1ad30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1ad40 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1ad50 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1ad60 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1ad70 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1ad80 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1ad90 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1ada0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1adb0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1adc0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1add0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1ade0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1adf0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1ae00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ae10 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1ae20 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1ae30 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1ae40 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1ae50 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1ae60 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1ae70 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1ae80 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1ae90 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1aea0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1aeb0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1aec0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1aed0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1aee0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1aef0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1af00 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1af10 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1af20 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1af30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1af40 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1af50 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1af60 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1af70 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1af80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1af90 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1afa0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1afb0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1afc0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1afd0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1afe0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1aff0 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1b000 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b010 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1b020 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1b030 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1b040 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1b050 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1b060 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1b070 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1b080 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1b090 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1b0a0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1b0b0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1b0c0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1b0d0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1b0e0 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1b0f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b100 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1b110 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1b120 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1b130 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1b140 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1b150 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1b160 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b170 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1b180 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1b190 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b1b0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1b1c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1b1d0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1b1f0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1b200 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1b210 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1b220 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1b230 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1b240 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1b250 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b260 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1b270 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1b280 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b290 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1b2a0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1b2b0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1b2c0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1b2d0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1b2e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1b2f0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1b300 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1b310 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1b320 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1b330 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1b340 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1b350 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1b360 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1b370 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1b380 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1b390 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1b3a0 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1b3b0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1b3c0 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
1b3d0 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
1b3e0 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
1b3f0 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
1b400 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
1b410 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1b420 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1b430 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
1b440 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1b450 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
1b460 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
1b470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1b480 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b490 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
1b4a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1b4b0 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
1b4c0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
1b4d0 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
1b4e0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1b4f0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1b500 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
1b510 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
1b520 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
1b530 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
1b540 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
1b550 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
1b560 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
1b570 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
1b580 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65  **.  ** TODO: Te
1b590 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f  chnically the fo
1b5a0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72  llowing is an er
1b5b0 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61  ror because it a
1b5c0 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a  ssumes that.  **
1b5d0 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54   buffer Pager.pT
1b5e0 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61  mpSpace is (mxPa
1b5f0 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20  thname+1) bytes 
1b600 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20  or larger. i.e. 
1b610 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65  that.  ** (pPage
1b620 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70  r->pageSize >= p
1b630 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1b640 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e  athname+1). Usin
1b650 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a  g os_unix.c,.  *
1b660 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73  *  mxPathname is
1b670 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74   512, which is t
1b680 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d  he same as the m
1b690 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  inimum allowable
1b6a0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20   value.  ** for 
1b6b0 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20  pageSize..  */. 
1b6c0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1b6d0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1b6e0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1b6f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1b700 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1b710 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1b720 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20  hname+1);.  if( 
1b730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b740 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
1b750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b760 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
1b770 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
1b780 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
1b790 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  s);.  }.  zMaste
1b7a0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1b7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72  =SQLITE_OK || !r
1b7c0 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  es ){.    goto e
1b7d0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1b7e0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1b7f0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65  alOff = 0;.  nee
1b800 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73  dPagerReset = is
1b810 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  Hot;..  /* This 
1b820 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
1b830 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65  either when a re
1b840 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f  adJournalHdr() o
1b850 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  r .  ** pager_pl
1b860 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b870 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53  ) call returns S
1b880 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
1b890 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20   IO error .  ** 
1b8a0 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20  occurs. .  */.  
1b8b0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1b8c0 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
1b8d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b8e0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1b8f0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1b900 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
1b910 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
1b920 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
1b930 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
1b940 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
1b950 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
1b960 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
1b970 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65  rocess must have
1b980 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
1b990 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
1b9a0 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
1b9b0 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
1b9c0 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
1b9d0 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
1b9e0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
1b9f0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
1ba00 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
1ba10 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
1ba20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ba30 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
1ba40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1ba50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ba60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1ba70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1ba80 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
1ba90 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1baa0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1bab0 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
1bac0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1bad0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
1bae0 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
1baf0 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
1bb00 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
1bb10 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
1bb20 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
1bb30 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
1bb40 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1bb50 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
1bb60 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
1bb70 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1bb80 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
1bb90 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
1bba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1bbb0 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
1bbc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1bbd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1bbe0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1bbf0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1bc00 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1bc10 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
1bc20 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
1bc30 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
1bc40 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
1bc50 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1bc60 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
1bc70 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
1bc80 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
1bc90 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
1bca0 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
1bcb0 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
1bcc0 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
1bcd0 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
1bce0 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
1bcf0 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
1bd00 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1bd10 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
1bd20 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
1bd30 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
1bd40 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
1bd50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1bd60 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
1bd70 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
1bd80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1bd90 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1bda0 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
1bdb0 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
1bdc0 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
1bdd0 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
1bde0 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
1bdf0 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
1be00 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
1be10 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1be20 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
1be30 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
1be40 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
1be50 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
1be60 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
1be70 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
1be80 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
1be90 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
1bea0 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
1beb0 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
1bec0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
1bed0 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
1bee0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
1bef0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
1bf00 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
1bf10 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
1bf20 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
1bf30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1bf40 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
1bf50 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
1bf60 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
1bf70 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
1bf80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1bf90 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
1bfa0 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
1bfb0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1bfc0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1bfd0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1bfe0 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
1bff0 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1c000 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
1c010 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
1c020 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1c030 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1c040 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1c050 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
1c060 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
1c070 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
1c080 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1c090 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
1c0a0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
1c0b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c0c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c0d0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1c0e0 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
1c0f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
1c100 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1c110 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
1c120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c130 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
1c140 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1c150 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1c160 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
1c170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c180 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
1c190 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
1c1a0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
1c1b0 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
1c1c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1c1d0 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65  nd/or page cache
1c1e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1c1f0 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
1c200 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
1c210 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a  edPagerReset ){.
1c220 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1c230 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1c240 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65       needPagerRe
1c250 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  set = 0;.      }
1c260 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1c270 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1c280 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67  age(pPager,&pPag
1c290 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30  er->journalOff,0
1c2a0 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ,1,0);.      if(
1c2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c2c0 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62  {.        nPlayb
1c2d0 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ack++;.      }el
1c2e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1c2f0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
1c310 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c320 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
1c330 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c340 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1c350 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1c360 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1c370 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1c380 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72  rnal has been tr
1c390 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20  uncated, simply 
1c3a0 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64  stop reading and
1c3b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1c3c0 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75  ocessing the jou
1c3d0 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74  rnal. This might
1c3e0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a   happen if the j
1c3f0 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20  ournal was.     
1c400 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70       ** not comp
1c410 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61  letely written a
1c420 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20  nd synced prior 
1c430 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20  to a crash.  In 
1c440 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1c450 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61  * case, the data
1c460 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65  base should have
1c470 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
1c480 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ten in the.     
1c490 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c       ** first pl
1c4a0 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20  ace so it is OK 
1c4b0 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f  to simply abando
1c4c0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  n the rollback. 
1c4d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1c4e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c4f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c500 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c520 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1c530 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
1c540 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74  ck, quit and ret
1c550 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20  urn the error.  
1c560 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e          ** code.
1c570 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
1c580 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  e the pager to e
1c590 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
1c5a0 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  tate.          *
1c5b0 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72  * so that no fur
1c5c0 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62  ther harm will b
1c5d0 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73  e done.  Perhaps
1c5e0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1c5f0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74      ** process t
1c600 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c  o come along wil
1c610 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  l be able to rol
1c620 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61  lback the databa
1c630 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1c640 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c650 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c670 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
1c680 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
1c690 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
1c6a0 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f  layback:.  /* Fo
1c6b0 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1c6c0 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1c6d0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1c6e0 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1c6f0 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1c700 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1c710 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1c720 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1c730 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1c740 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1c750 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1c760 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1c770 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1c780 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1c790 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1c7a0 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1c7b0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c7c0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1c7d0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1c7e0 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  hods ){.    sqli
1c7f0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1c800 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1c810 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c820 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20  UNCHANGED,0);.  
1c830 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1c840 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
1c850 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
1c860 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
1c870 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
1c880 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
1c890 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
1c8a0 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
1c8b0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
1c8c0 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
1c8d0 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
1c8e0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
1c8f0 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
1c900 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c910 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
1c920 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
1c930 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
1c940 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
1c950 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
1c960 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
1c970 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
1c980 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
1c990 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
1c9a0 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
1c9b0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1c9c0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
1c9d0 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
1c9e0 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
1c9f0 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
1ca00 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
1ca10 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
1ca20 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1ca30 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
1ca40 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
1ca50 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
1ca60 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
1ca70 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
1ca80 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
1ca90 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1caa0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1cab0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
1cac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cad0 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
1cae0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1caf0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1cb00 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1cb10 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1cb20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1cb30 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1cb40 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1cb50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1cb60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cb70 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67  E_OK.   && (pPag
1cb80 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1cb90 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1cba0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1cbb0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
1cbc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1cbd0 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61  te3PagerSync(pPa
1cbe0 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ger, 0);.  }.  i
1cbf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cc00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1cc10 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1cc20 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
1cc30 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b  er[0]!='\0', 0);
1cc40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1cc50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1cc60 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1cc70 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1cc80 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1cc90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1cca0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1ccb0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1ccc0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1ccd0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1cce0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1ccf0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1cd00 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1cd10 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1cd20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1cd30 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1cd40 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1cd50 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1cd60 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1cd70 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62   isHot && nPlayb
1cd80 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ack ){.    sqlit
1cd90 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
1cda0 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
1cdb0 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65  LBACK, "recovere
1cdc0 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20  d %d pages from 
1cdd0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
1cde0 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20       nPlayback, 
1cdf0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1ce00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
1ce10 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1ce20 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
1ce30 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
1ce40 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
1ce50 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
1ce60 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
1ce70 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
1ce80 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
1ce90 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
1cea0 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
1ceb0 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1cec0 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
1ced0 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
1cee0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1cef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1cf00 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1cf10 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
1cf20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1cf30 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1cf40 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
1cf50 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
1cf60 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
1cf70 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
1cf80 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1cf90 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
1cfa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1cfb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
1cfc0 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
1cfd0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
1cfe0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1cff0 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
1d000 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
1d010 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d020 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
1d030 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1d040 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
1d050 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1d060 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1d070 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
1d080 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d090 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1d0a0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
1d0b0 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46  Hdr *pPg, u32 iF
1d0c0 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a  rame){.  Pager *
1d0d0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1d0e0 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
1d0f0 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1d100 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
1d110 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
1d120 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
1d130 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1d140 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1d150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1d170 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1d180 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d  t pgsz = pPager-
1d190 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75  >pageSize; /* Nu
1d1a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1d1b0 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
1d1c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1d1d0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1d1e0 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1d1f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1d200 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23  Pager->fd) );..#
1d210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d220 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72  IT_WAL.  if( iFr
1d230 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ame ){.    /* Tr
1d240 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61  y to pull the pa
1d250 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74  ge from the writ
1d260 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a  e-ahead log. */.
1d270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d280 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61  WalReadFrame(pPa
1d290 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d  ger->pWal, iFram
1d2a0 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44  e, pgsz, pPg->pD
1d2b0 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  ata);.  }else.#e
1d2c0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34  ndif.  {.    i64
1d2d0 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
1d2e0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1d2f0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
1d300 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1d310 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
1d320 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20  g->pData, pgsz, 
1d330 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
1d340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1d350 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1d360 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d370 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1d380 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
1d390 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
1d3a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1d3b0 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
1d3c0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
1d3d0 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
1d3e0 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
1d3f0 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
1d400 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
1d410 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
1d420 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
1d430 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
1d440 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
1d450 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
1d460 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
1d470 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
1d480 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
1d490 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1d4a0 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
1d4b0 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
1d4c0 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
1d4d0 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
1d4e0 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
1d4f0 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
1d500 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
1d510 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
1d520 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
1d530 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
1d540 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
1d550 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1d560 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
1d570 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
1d580 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
1d590 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
1d5a0 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
1d5b0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d5c0 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
1d5d0 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
1d5e0 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
1d5f0 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
1d600 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ing equaling 16 
1d610 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1d620 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1d630 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1d640 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1d650 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1d660 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1d670 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1d680 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1d690 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1d6a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d6b0 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1d6c0 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1d6d0 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1d6e0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1d6f0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1d700 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1d710 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1d720 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1d730 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1d740 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1d750 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
1d760 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50  ITE_NOMEM);..  P
1d770 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1d780 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
1d790 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
1d7a0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
1d7b0 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
1d7c0 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
1d7d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1d7e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
1d7f0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1d800 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1d820 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1d830 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1d840 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
1d850 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d860 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c  * Update the val
1d870 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
1d880 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73  -counter at offs
1d890 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e  ets 24 and 92 in
1d8a0 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61  .** the header a
1d8b0 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65  nd the sqlite ve
1d8c0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20  rsion number at 
1d8d0 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a  offset 96..**.**
1d8e0 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f   This is an unco
1d8f0 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65  nditional update
1d900 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
1d910 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1d920 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f  ecounter().** ro
1d930 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79  utine which only
1d940 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1d950 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74  nge-counter if t
1d960 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74  he update is act
1d970 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c  ually.** needed,
1d980 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   as determined b
1d990 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  y the pPager->ch
1d9a0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74  angeCountDone st
1d9b0 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ate variable..*/
1d9c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1d9d0 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1d9e0 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50  ounter(PgHdr *pP
1d9f0 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  g){.  u32 change
1da00 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20  _counter;..  /* 
1da10 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1da20 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1da30 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1da40 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1da50 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1da60 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
1da70 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67  e((u8*)pPg->pPag
1da80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b  er->dbFileVers)+
1da90 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  1;.  put32bits((
1daa0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1dab0 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
1dac0 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c  unter);..  /* Al
1dad0 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
1dae0 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1daf0 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
1db00 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62  99 and in.  ** b
1db10 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
1db20 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
1db30 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
1db40 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
1db50 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e  r.  ** is valid.
1db60 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
1db70 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1db80 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63  ta)+92, change_c
1db90 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32  ounter);.  put32
1dba0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1dbb0 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
1dbc0 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
1dbd0 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ER);.}..#ifndef 
1dbe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1dbf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1dc00 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
1dc10 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
1dc20 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1dc30 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
1dc40 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
1dc50 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
1dc60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1dc70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
1dc80 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
1dc90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1dca0 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
1dcb0 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
1dcc0 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
1dcd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1dce0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1dcf0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
1dd00 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
1dd10 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
1dd20 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
1dd30 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
1dd40 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
1dd50 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
1dd60 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
1dd70 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
1dd80 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
1dd90 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
1dda0 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
1ddb0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ddc0 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
1ddd0 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
1dde0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1ddf0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
1de00 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
1de10 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
1de20 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1de30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1de40 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
1de50 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
1de60 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
1de70 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
1de80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1de90 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1dea0 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1deb0 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
1dec0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1ded0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1dee0 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71  r) );.  pPg = sq
1def0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1df00 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1df10 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1df20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1df30 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1df40 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1df50 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1df60 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1df70 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61  {.      u32 iFra
1df80 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  me = 0;.      rc
1df90 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
1dfa0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1dfb0 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Wal, pPg->pgno, 
1dfc0 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
1dfd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dfe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1dff0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1e000 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
1e010 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1e020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e030 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1e040 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
1e050 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1e060 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
1e070 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d  Null(pPg);.    }
1e080 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
1e090 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61  lly, if a transa
1e0a0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1e0b0 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70  back, any backup
1e0c0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20   processes are. 
1e0d0 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64   ** updated as d
1e0e0 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75  ata is copied ou
1e0f0 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  t of the rollbac
1e100 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e  k journal and in
1e110 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
1e120 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  base. This is no
1e130 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73  t generally poss
1e140 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20  ible with a WAL 
1e150 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a  database, as.  *
1e160 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c  * rollback invol
1e170 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63  ves simply trunc
1e180 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  ating the log fi
1e190 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69  le. Therefore, i
1e1a0 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f  f one.  ** or mo
1e1b0 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61  re frames have a
1e1c0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1e1d0 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28  ten to the log (
1e1e0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20  and therefore . 
1e1f0 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20   ** also copied 
1e200 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20  into the backup 
1e210 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61  databases) as pa
1e220 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  rt of this trans
1e230 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
1e240 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65   backups must be
1e250 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f   restarted..  */
1e260 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
1e270 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
1e280 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74  pBackup);..  ret
1e290 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e2a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e2b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
1e2c0 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1e2d0 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61  on on a WAL data
1e2e0 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
1e2f0 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  int pagerRollbac
1e300 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  kWal(Pager *pPag
1e310 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e340 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72   Code */.  PgHdr
1e350 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
1e360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1e370 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1e380 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a  s to revert */..
1e390 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67    /* For all pag
1e3a0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
1e3b0 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
1e3c0 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65  ly dirty or have
1e3d0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
1e3e0 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20  en written (but 
1e3f0 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74  not committed) t
1e400 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20  o the log file, 
1e410 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20  do one of the . 
1e420 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20   ** following:. 
1e430 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73   **.  **   + Dis
1e440 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20  card the cached 
1e450 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e  page (if refcoun
1e460 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20  t==0), or.  **  
1e470 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63   + Reload page c
1e480 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1e490 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66  database (if ref
1e4a0 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20  count>0)..  */. 
1e4b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1e4c0 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
1e4d0 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1e4e0 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67  ite3WalUndo(pPag
1e4f0 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55  er->pWal, pagerU
1e500 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  ndoCallback, (vo
1e510 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20  id *)pPager);.  
1e520 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1e530 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1e540 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1e550 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1e560 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1e570 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1e580 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
1e590 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  irty;.    rc = p
1e5a0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1e5b0 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c  ((void *)pPager,
1e5c0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1e5d0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
1e5e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e5f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e600 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1e610 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
1e620 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1e630 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f  ). As well as lo
1e640 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  gging.** the con
1e650 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73  tents of the lis
1e660 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65  t of pages heade
1e670 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e  d by pList (conn
1e680 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29  ected by pDirty)
1e690 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1e6a0 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20  on notifies any 
1e6b0 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72  active backup pr
1e6c0 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65  ocesses that the
1e6d0 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63   pages have.** c
1e6e0 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  hanged. .**.** T
1e6f0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1e700 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
1e710 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77  s routine is alw
1e720 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61  ays sorted by pa
1e730 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65  ge number..** He
1e740 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61  nce, if page 1 a
1e750 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20  ppears anywhere 
1e760 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20  on the list, it 
1e770 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
1e780 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74  t page..*/ .stat
1e790 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
1e7a0 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
1e7b0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
1e7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1e7d0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
1e7e0 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e800 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
1e810 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
1e820 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
1e830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1e840 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
1e850 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
1e860 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1e890 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
1e8a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1e8d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1e8e0 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  nList;          
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e900 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e910 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20 64  n pList */.#if d
1e920 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1e930 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1e940 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1e950 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  ES).  PgHdr *p; 
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1e980 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20  ping over pages 
1e990 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
1e9a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
1e9b0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1e9c0 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53  List );.#ifdef S
1e9d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1e9e0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1e9f0 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e   page list is in
1ea00 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
1ea10 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73   */.  for(p=pLis
1ea20 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74  t; p && p->pDirt
1ea30 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  y; p=p->pDirty){
1ea40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1ea50 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79  pgno < p->pDirty
1ea60 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65  ->pgno );.  }.#e
1ea70 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1ea80 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
1ea90 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   || isCommit );.
1eaa0 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29    if( isCommit )
1eab0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41  {.    /* If a WA
1eac0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1ead0 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
1eae0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  , there is no po
1eaf0 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20  int in writing. 
1eb00 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20     ** any pages 
1eb10 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1eb20 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
1eb30 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68  Truncate into th
1eb40 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20  e WAL file..    
1eb50 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76  ** They will nev
1eb60 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e  er be read by an
1eb70 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d  y client. So rem
1eb80 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
1eb90 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20  e pDirty.    ** 
1eba0 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20  list here. */.  
1ebb0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
1ebc0 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d  PgHdr **ppNext =
1ebd0 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69   &pList;.    nLi
1ebe0 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  st = 0;.    for(
1ebf0 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78  p=pList; (*ppNex
1ec00 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e  t = p)!=0; p=p->
1ec10 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69  pDirty){.      i
1ec20 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75  f( p->pgno<=nTru
1ec30 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  ncate ){.       
1ec40 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44   ppNext = &p->pD
1ec50 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c  irty;.        nL
1ec60 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ist++;.      }. 
1ec70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1ec80 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73   pList );.  }els
1ec90 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31  e{.    nList = 1
1eca0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1ecb0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
1ecc0 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74  _WRITE] += nList
1ecd0 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  ;..  if( pList->
1ece0 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
1ecf0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
1ed00 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63  ter(pList);.  rc
1ed10 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61   = sqlite3WalFra
1ed20 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  mes(pPager->pWal
1ed30 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1ed40 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74  >pageSize, pList
1ed50 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43  , nTruncate, isC
1ed60 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77  ommit, pPager->w
1ed70 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b  alSyncFlags.  );
1ed80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ed90 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1eda0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
1edb0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
1edc0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1edd0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1ede0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1edf0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1ee00 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1ee10 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1ee20 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1ee30 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1ee40 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73  AGES.  pList = s
1ee50 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1ee60 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1ee70 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Cache);.  for(p=
1ee80 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1ee90 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65  Dirty){.    page
1eea0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
1eeb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1eec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eed0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
1eee0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
1eef0 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
1ef00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1ef10 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
1ef20 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
1ef30 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
1ef40 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
1ef50 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
1ef60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ef70 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1ef80 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
1ef90 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
1efa0 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
1efb0 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
1efc0 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
1efd0 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
1efe0 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
1eff0 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
1f000 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
1f010 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
1f020 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1f030 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f040 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f060 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f070 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
1f080 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1f090 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f0a0 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
1f0b0 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
1f0c0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1f0d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1f0e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f0f0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f100 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1f110 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
1f120 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  );..  /* sqlite3
1f130 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f140 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20  ction() was not 
1f150 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
1f160 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61  revious.  ** tra
1f170 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b  nsaction in lock
1f180 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
1f190 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20  VE.  So call it 
1f1a0 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  now.  If we.  **
1f1b0 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   are in locking_
1f1c0 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20  mode=NORMAL and 
1f1d0 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72  EndRead() was pr
1f1e0 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c  eviously called,
1f1f0 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63  .  ** the duplic
1f200 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d  ate call is harm
1f210 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  less..  */.  sql
1f220 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1f230 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1f240 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pWal);..  rc =
1f250 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
1f260 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f270 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
1f280 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
1f290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1f2a0 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70  changed ){.    p
1f2b0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1f2c0 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46  r);.    if( USEF
1f2d0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
1f2e0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
1f2f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
1f300 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1f310 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1f320 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f330 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
1f340 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  part of the tran
1f350 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45  sition from PAGE
1f360 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47  R_OPEN.** to PAG
1f370 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
1f380 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1f390 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f3a0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e  abase file.** in
1f3b0 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67   pages (assuming
1f3c0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
1f3d0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1f3e0 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  in Pager.pageSiz
1f3f0 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  e)..**.** If no 
1f400 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
1f410 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f420 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65  ned and the size
1f430 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f440 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20  .** in pages is 
1f450 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67  stored in *pnPag
1f460 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  e. Otherwise, an
1f470 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72   error code (per
1f480 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  haps.** SQLITE_I
1f490 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72  OERR_FSTAT) is r
1f4a0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1f4b0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  age is left unmo
1f4c0 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  dified..*/.stati
1f4d0 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63  c int pagerPagec
1f4e0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1f4f0 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65  er, Pgno *pnPage
1f500 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f520 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1f530 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50   return via *pnP
1f540 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65  age */..  /* Que
1f550 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  ry the WAL sub-s
1f560 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61  ystem for the da
1f570 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65  tabase size. The
1f580 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a   WalDbsize().  *
1f590 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1f5a0 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57  ns zero if the W
1f5b0 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28  AL is not open (
1f5c0 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d  i.e. Pager.pWal=
1f5d0 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20  =0), or.  ** if 
1f5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f5f0 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1f600 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  le. The database
1f610 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a   size is not.  *
1f620 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  * available from
1f630 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1f640 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66  tem if the log f
1f650 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a  ile is empty or.
1f660 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
1f670 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64   valid committed
1f680 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
1f690 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1f6a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f6b0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1f6c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1f6d0 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1f6e0 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1f6f0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1f700 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1f710 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1f720 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74  ase size was not
1f730 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1f740 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1f750 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69  em,.  ** determi
1f760 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74  ne it based on t
1f770 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f780 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1f790 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f   the size.  ** o
1f7a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f7b0 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ile is not an in
1f7c0 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
1f7d0 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
1f7e0 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e  .  ** round down
1f7f0 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20   to the nearest 
1f800 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e  page. Except, an
1f810 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68  y file larger th
1f820 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20  an 0.  ** bytes 
1f830 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69  in size is consi
1f840 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dered to contain
1f850 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61   at least one pa
1f860 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
1f870 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Page==0 ){.    i
1f880 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8a0 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20  Size of db file 
1f8b0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
1f8c0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1f8d0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1f8e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1f8f0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
1f900 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
1f910 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
1f920 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1f930 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
1f940 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f980 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
1f990 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  ((n+pPager->page
1f9a0 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72  Size-1) / pPager
1f9b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
1f9c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1f9d0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
1f9e0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
1f9f0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
1fa00 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  n the.  ** confi
1fa10 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
1fa20 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
1fa30 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
1fa40 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
1fa50 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
1fa60 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
1fa70 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
1fa80 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1fa90 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1faa0 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
1fab0 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
1fac0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1fad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1fae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1faf0 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63  T_WAL./*.** Chec
1fb00 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
1fb10 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
1fb20 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
1fb30 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
1fb40 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20  Pager.** exists 
1fb50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1fb60 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20  is not empy, or 
1fb70 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1fb80 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  *-wal file does.
1fb90 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79  ** not exist (by
1fba0 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66   deleting it) if
1fbb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fbc0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
1fbd0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1fbe0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  se is not empty 
1fbf0 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  and the *-wal fi
1fc00 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20  le exists, open 
1fc10 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20  the pager.** in 
1fc20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68  WAL mode.  If th
1fc30 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
1fc40 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77  pty or if no *-w
1fc50 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
1fc60 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f  nd.** if no erro
1fc70 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73  r occurs, make s
1fc80 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ure Pager.journa
1fc90 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74  lMode is not set
1fca0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   to.** PAGER_JOU
1fcb0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a  RNALMODE_WAL..**
1fcc0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1fcd0 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72  E_OK or an error
1fce0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
1fcf0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
1fd00 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
1fd10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fd20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
1fd30 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
1fd40 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
1fd50 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1fd60 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
1fd70 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
1fd80 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
1fd90 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
1fda0 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
1fdb0 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
1fdc0 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
1fdd0 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
1fde0 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
1fdf0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
1fe00 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
1fe10 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
1fe20 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1fe30 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
1fe40 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
1fe50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1fe60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1fe70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1fe80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1fe90 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
1fea0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1feb0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
1fec0 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
1fed0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
1fee0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
1ff10 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
1ff20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64  /* Size of the d
1ff50 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1ff60 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
1ff70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1ff80 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66   &nPage);.    if
1ff90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ffa0 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d  ;.    if( nPage=
1ffb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1ffc0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1ffd0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
1ffe0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b  Pager->zWal, 0);
1fff0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20000 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
20010 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20  TE_NOENT ) rc = 
20020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
20030 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20   isWal = 0;.    
20040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
20050 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
20060 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  s(.          pPa
20070 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
20080 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f  r->zWal, SQLITE_
20090 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
200a0 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20  isWal.      );. 
200b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
200c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
200d0 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b      if( isWal ){
200e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
200f0 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  e( sqlite3Pcache
20100 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20110 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
20120 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
20130 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
20140 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  l(pPager, 0);.  
20150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
20160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
20170 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
20180 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
20190 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
201a0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
201b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
201c0 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
201d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
201e0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
201f0 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65  ** Playback save
20200 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74  point pSavepoint
20210 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f  . Or, if pSavepo
20220 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20  int==NULL, then 
20230 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20  playback.** the 
20240 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
20250 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
20260 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d  case pSavepoint=
20270 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65  =NULL occurs whe
20280 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b  n .** a ROLLBACK
20290 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69   TO command is i
202a0 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45  nvoked on a SAVE
202b0 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20  POINT that is a 
202c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
202d0 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  savepoint..**.**
202e0 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74   When pSavepoint
202f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65   is not NULL (me
20300 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e  aning a non-tran
20310 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
20320 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72  t is .** being r
20330 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65  olled back), the
20340 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63  n the rollback c
20350 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f  onsists of up to
20360 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a   three stages,.*
20370 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74  * performed in t
20380 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69  he order specifi
20390 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  ed:.**.**   * Pa
203a0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62  ges are played b
203b0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
203c0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
203d0 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20  ng at byte.**   
203e0 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61    offset PagerSa
203f0 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
20400 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
20410 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  o .**     PagerS
20420 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20430 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65  set, or to the e
20440 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
20450 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
20460 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70  le if PagerSavep
20470 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
20480 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20  is zero..**.**  
20490 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70   * If PagerSavep
204a0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
204b0 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
204c0 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79  n pages are play
204d0 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73  ed.**     back s
204e0 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65  tarting from the
204f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
20500 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
20510 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61  owing .**     Pa
20520 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
20530 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65  rOffset to the e
20540 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
20550 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
20560 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
20570 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63   then played bac
20580 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  k from the sub-j
20590 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61  ournal file, sta
205a0 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74  rting.**     wit
205b0 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  h the PagerSavep
205c0 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64  oint.iSubRec and
205d0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
205e0 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20  he end of.**    
205f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20600 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68  e..**.** Through
20610 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  out the rollback
20620 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74   process, each t
20630 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f  ime a page is ro
20640 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a  lled back, the.*
20650 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
20660 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20  bit is set in a 
20670 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
20680 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65   (variable pDone
20690 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65   in the.** imple
206a0 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29  mentation below)
206b0 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
206c0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20  o ensure that a 
206d0 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  page is only.** 
206e0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
206f0 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73  first time it is
20700 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
20710 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  either journal..
20720 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f  **.** If pSavepo
20730 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  int is NULL, the
20740 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79  n pages are only
20750 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
20760 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  m the main.** jo
20770 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72  urnal file. Ther
20780 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
20790 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69   a bitvec in thi
207a0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  s case..**.** In
207b0 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65   either case, be
207c0 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f  fore playback co
207d0 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65  mmences the Page
207e0 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  r.dbSize variabl
207f0 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f  e.** is reset to
20800 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
20810 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73  it held at the s
20820 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65  tart of the save
20830 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72  point .** (or tr
20840 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70  ansaction). No p
20850 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d  age with a page-
20860 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
20870 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a  han this value.*
20880 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  * is played back
20890 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f  . If one is enco
208a0 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69  untered it is si
208b0 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  mply skipped..*/
208c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
208d0 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
208e0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
208f0 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  , PagerSavepoint
20900 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20   *pSavepoint){. 
20910 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
20920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66            /* Eff
20930 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
20940 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20950 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
20960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20970 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65   End of first se
20980 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f  gment of main-jo
20990 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f  urnal records */
209a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
209b0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
209c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
209d0 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20  Bitvec *pDone = 
209e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76  0;       /* Bitv
209f0 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67  ec to ensure pag
20a00 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  es played back o
20a10 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61  nly once */..  a
20a20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20a30 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
20a40 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
20a50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
20a60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
20a70 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  KED );..  /* All
20a80 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74  ocate a bitvec t
20a90 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74  o use to store t
20aa0 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  he set of pages 
20ab0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
20ac0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
20ad0 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73  ){.    pDone = s
20ae0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
20af0 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  te(pSavepoint->n
20b00 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21  Orig);.    if( !
20b10 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72  pDone ){.      r
20b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
20b30 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EM;.    }.  }.. 
20b40 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
20b50 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
20b60 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
20b70 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
20b80 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
20b90 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
20ba0 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
20bb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
20bc0 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
20bd0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
20be0 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
20bf0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
20c00 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
20c10 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
20c20 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76  le;..  if( !pSav
20c30 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55  epoint && pagerU
20c40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
20c50 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
20c60 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61  rRollbackWal(pPa
20c70 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
20c80 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
20c90 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
20ca0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
20cb0 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
20cc0 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
20cd0 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
20ce0 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
20cf0 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
20d00 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
20d10 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
20d20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d30 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
20d40 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
20d50 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
20d60 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
20d70 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
20d80 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
20d90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61  >journalOff;.  a
20da0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
20db0 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
20dc0 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a   szJ==0 );..  /*
20dd0 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
20de0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
20df0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
20e00 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20e10 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
20e20 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
20e30 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
20e40 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
20e50 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
20e60 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
20e70 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
20e80 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
20e90 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
20ea0 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
20eb0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
20ec0 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
20ed0 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
20ee0 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
20ef0 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
20f00 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
20f10 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
20f20 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
20f30 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
20f40 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
20f50 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67  avepoint && !pag
20f60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20f70 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
20f80 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
20f90 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
20fa0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
20fb0 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
20fc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20fd0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
20fe0 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
20ff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21000 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
21010 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
21020 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21030 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
21040 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
21050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
21060 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
21070 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21080 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21090 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
210a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
210b0 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
210c0 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
210d0 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
210e0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
210f0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
21100 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
21110 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
21120 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
21130 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
21140 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
21150 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
21160 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
21170 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
21180 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
21190 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
211a0 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
211b0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
211c0 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
211d0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
211e0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
211f0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
21200 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
21210 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21220 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
21230 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
21240 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
21250 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
21260 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
21270 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
21280 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
21290 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c   0, szJ, &nJRec,
212a0 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73   &dummy);.    as
212b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
212c0 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  _DONE );..    /*
212d0 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61  .    ** The "pPa
212e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
212f0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
21300 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
21310 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20  journalOff".    
21320 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74  ** test is relat
21330 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35  ed to ticket #25
21340 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73  65.  See the dis
21350 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  cussion in the. 
21360 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79     ** pager_play
21370 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
21380 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
21390 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
213a0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  */.    if( nJRec
213b0 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
213c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
213d0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
213e0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
213f0 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
21400 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
21410 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
21420 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
21430 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
21440 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
21450 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
21460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
21470 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
21480 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
21490 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
214a0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
214b0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
214c0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
214d0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
214e0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
214f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21500 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
21510 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21520 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
21530 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73  r->journalOff>=s
21540 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
21550 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
21560 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
21570 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
21580 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
21590 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
215a0 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
215b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
215c0 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
215d0 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
215e0 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
215f0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
21600 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
21610 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
21620 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
21630 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
21640 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21650 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
21660 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61  ffset = (i64)pSa
21670 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
21680 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21690 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Size);..    if( 
216a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
216b0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
216c0 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
216d0 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72  pointUndo(pPager
216e0 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69  ->pWal, pSavepoi
216f0 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20  nt->aWalData);. 
21700 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
21710 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
21720 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
21730 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
21740 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
21750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
21760 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28  ffset==(i64)ii*(
21770 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
21780 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
21790 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
217a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
217b0 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
217c0 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
217d0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
217e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
217f0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
21800 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
21810 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
21830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21840 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65  = szJ;.  }..  re
21850 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21860 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
21870 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
21880 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
21890 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
218a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
218b0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
218c0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
218d0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
218e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
218f0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
21900 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
21910 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
21920 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
21930 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
21940 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
21950 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
21960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21970 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
21980 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21990 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
219a0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
219b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
219c0 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
219d0 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
219e0 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
219f0 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
21a00 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21a10 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
21a20 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
21a30 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
21a40 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
21a50 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
21a60 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
21a70 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
21a80 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73  TL_MMAP_SIZE, &s
21a90 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
21aa0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21ab0 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
21ac0 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61  of any memory ma
21ad0 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68  pping made of th
21ae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21af0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b00 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
21b10 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
21b20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21b30 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72  zMmap){.  pPager
21b40 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61  ->szMmap = szMma
21b50 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70  p;.  pagerFixMap
21b60 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d  limit(pPager);.}
21b70 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20  ../*.** Free as 
21b80 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
21b90 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65  ossible from the
21ba0 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20   pager..*/.void 
21bb0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
21bc0 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nk(Pager *pPager
21bd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
21be0 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d  heShrink(pPager-
21bf0 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
21c00 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69  .** Adjust setti
21c10 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  ngs of the pager
21c20 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
21c30 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61  ied in the pgFla
21c40 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  gs parameter..**
21c50 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20  .** The "level" 
21c60 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  in pgFlags & PAG
21c70 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
21c80 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62  ASK sets the rob
21c90 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68  ustness.** of th
21ca0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
21cb0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
21cc0 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20  rashes or power 
21cd0 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63  failures by.** c
21ce0 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
21cf0 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
21d00 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  hen writing the 
21d10 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
21d20 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
21d30 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
21d40 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
21d50 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
21d60 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
21d70 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21d90 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
21da0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
21db0 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
21dc0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
21dd0 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
21de0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
21df0 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
21e00 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
21e10 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
21e20 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
21e30 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
21e40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
21e50 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
21e60 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
21e70 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
21e80 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
21e90 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
21ea0 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
21eb0 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
21ec0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
21ee0 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
21ef0 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
21f00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
21f10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21f20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
21f30 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
21f40 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
21f50 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
21f60 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
21f70 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
21f80 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21f90 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
21fa0 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
21fb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
21fc0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
21fe0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
21ff0 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
22000 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
22010 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
22020 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
22030 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
22040 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
22050 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
22060 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
22070 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
22080 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
22090 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
220a0 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
220b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
220c0 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
220d0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
220e0 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
220f0 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
22100 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
22110 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
22120 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f  k..**.** The abo
22130 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c  ve is for a roll
22140 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  back-journal mod
22150 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65  e.  For WAL mode
22160 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a  , OFF continues.
22170 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20  ** to mean that 
22180 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63  no syncs ever oc
22190 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61  cur.  NORMAL mea
221a0 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20  ns that the WAL 
221b0 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69  is synced.** pri
221c0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
221d0 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  of checkpoint an
221e0 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
221f0 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63  ase file is sync
22200 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ed.** at the con
22210 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  clusion of the c
22220 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
22230 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
22240 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61  of the WAL.** wa
22250 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  s written back i
22260 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
22270 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f  .  But no sync o
22280 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20  perations occur 
22290 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  for.** an ordina
222a0 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52  ry commit in NOR
222b0 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41  MAL mode with WA
222c0 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74  L.  FULL means t
222d0 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66  hat the WAL.** f
222e0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f  ile is synced fo
222f0 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d  llowing each com
22300 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  mit operation, i
22310 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
22320 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63  e.** syncs assoc
22330 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41  iated with NORMA
22340 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  L..**.** Do not 
22350 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e  confuse synchron
22360 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51  ous=FULL with SQ
22370 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20  LITE_SYNC_FULL. 
22380 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   The.** SQLITE_S
22390 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d  YNC_FULL macro m
223a0 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20  eans to use the 
223b0 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c  MacOSX-style ful
223c0 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67  l-fsync.** using
223d0 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59   fcntl(F_FULLFSY
223e0 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e  NC).  SQLITE_SYN
223f0 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74  C_NORMAL means t
22400 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  o do an.** ordin
22410 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c  ary fsync() call
22420 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
22430 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
22440 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  n SQLITE_SYNC_FU
22450 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45  LL.** and SQLITE
22460 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20  _SYNC_NORMAL on 
22470 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20  platforms other 
22480 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75  than MacOSX.  Bu
22490 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f  t the.** synchro
224a0 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73  nous=FULL versus
224b0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
224c0 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65  MAL setting dete
224d0 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74  rmines when.** t
224e0 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69  he xSync primiti
224f0 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  ve is called and
22500 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20   is relevant to 
22510 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a  all platforms..*
22520 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
22530 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
22540 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
22550 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
22560 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
22570 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
22580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
22590 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
225a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
225b0 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70  lags(.  Pager *p
225c0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
225d0 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65   The pager to se
225e0 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66  t safety level f
225f0 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  or */.  unsigned
22600 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a   pgFlags      /*
22610 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a   Various flags *
22620 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
22630 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20  level = pgFlags 
22640 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
22650 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65  OUS_MASK;.  asse
22660 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
22670 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50  level<=3 );.  pP
22680 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
22690 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
226a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
226b0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
226c0 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
226d0 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
226e0 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
226f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
22700 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
22710 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22720 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  0;.    pPager->c
22730 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30  kptSyncFlags = 0
22740 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
22750 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55  Flags & PAGER_FU
22760 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70  LLFSYNC ){.    p
22770 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22780 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
22790 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ULL;.    pPager-
227a0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
227b0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
227c0 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  L;.  }else if( p
227d0 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
227e0 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  KPT_FULLFSYNC ){
227f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22800 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22810 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22820 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22830 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22840 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
22850 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
22860 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22870 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22880 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22890 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
228a0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
228b0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61    }.  pPager->wa
228c0 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  lSyncFlags = pPa
228d0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
228e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
228f0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
22900 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
22910 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54  gs |= WAL_SYNC_T
22920 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d  RANSACTIONS;.  }
22930 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  .  if( pgFlags &
22940 20 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c   PAGER_CACHESPIL
22950 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  L ){.    pPager-
22960 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e  >doNotSpill &= ~
22970 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
22980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
22990 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
229a0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b  = SPILLFLAG_OFF;
229b0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
229c0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
229d0 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
229e0 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
229f0 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
22a00 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
22a10 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
22a20 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
22a30 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
22a40 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
22a50 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
22a60 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
22a70 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
22a80 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
22a90 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
22aa0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
22ab0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
22ac0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
22ad0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22ae0 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c  iptor into *pFil
22af0 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
22b00 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a  _OK on success .
22b10 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
22b20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
22b30 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
22b40 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
22b50 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  y .** delete the
22b60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
22b70 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
22b80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
22b90 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  gs passed to the
22ba0 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e   VFS layer xOpen
22bb0 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73  () call are thos
22bc0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
22bd0 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46  y parameter vfsF
22be0 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74  lags ORed with t
22bf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
22c00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22c10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a  PEN_READWRITE.**
22c20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22c30 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53  _CREATE.**     S
22c40 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
22c50 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  SIVE.**     SQLI
22c60 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
22c70 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20  CLOSE.*/.static 
22c80 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  int pagerOpentem
22c90 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
22ca0 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
22cb0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  e pager object *
22cc0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
22cd0 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
22ce0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
22cf0 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
22d00 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
22d10 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
22d20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
22d30 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
22d40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
22d50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
22d60 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65  n code */..#ifde
22d70 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
22d80 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
22d90 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
22da0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
22db0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
22dc0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
22dd0 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
22de0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
22df0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
22e00 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
22e10 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22e20 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
22e30 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
22e40 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
22e50 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67  lite3OsOpen(pPag
22e60 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69  er->pVfs, 0, pFi
22e70 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
22e80 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
22e90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
22ea0 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  pen(pFile) );.  
22eb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22ec0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
22ed0 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
22ee0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  n..**.** The pag
22ef0 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62  er invokes the b
22f00 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73  usy-handler if s
22f10 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72  qlite3OsLock() r
22f20 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
22f30 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69  E_BUSY when tryi
22f40 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
22f50 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20  om no-lock to a 
22f60 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20  SHARED lock,.** 
22f70 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  or when trying t
22f80 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
22f90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74   RESERVED lock t
22fa0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  o an EXCLUSIVE .
22fb0 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73  ** lock. It does
22fc0 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68   *not* invoke th
22fd0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77  e busy handler w
22fe0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
22ff0 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20  om.** SHARED to 
23000 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65  RESERVED, or whe
23010 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
23020 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55   SHARED to EXCLU
23030 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f  SIVE.** (which o
23040 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74  ccurs during hot
23050 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
23060 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a  k). Summary:.**.
23070 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20  **   Transition 
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73         | Invokes
230a0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a   xBusyHandler.**
230b0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
230c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
230f0 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d   NO_LOCK       -
23100 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  > SHARED_LOCK   
23110 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48     | Yes.**   SH
23120 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52  ARED_LOCK   -> R
23130 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20  ESERVED_LOCK    
23140 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44  | No.**   SHARED
23150 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55  _LOCK   -> EXCLU
23160 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f  SIVE_LOCK   | No
23170 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c  .**   RESERVED_L
23180 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  OCK -> EXCLUSIVE
23190 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a  _LOCK   | Yes.**
231a0 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d  .** If the busy-
231b0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
231c0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
231d0 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a  o, the lock is .
231e0 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69  ** retried. If i
231f0 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  t returns zero, 
23200 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  then the SQLITE_
23210 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a  BUSY error is.**
23220 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
23230 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70   caller of the p
23240 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
23250 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
23260 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
23270 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
23280 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
232a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
232b0 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
232c0 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20  ndler)(void *), 
232d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
232e0 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c  er to busy-handl
232f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  er function */. 
23300 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
23310 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20  lerArg          
23320 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
23330 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75  t to pass to xBu
23340 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a  syHandler */.){.
23350 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
23360 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
23370 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
23380 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
23390 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
233a0 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65  rg;..  if( isOpe
233b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
233c0 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d  .    void **ap =
233d0 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65   (void **)&pPage
233e0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b  r->xBusyHandler;
233f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69  .    assert( ((i
23400 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61  nt(*)(void *))(a
23410 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e  p[0]))==xBusyHan
23420 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65  dler );.    asse
23430 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79  rt( ap[1]==pBusy
23440 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20  HandlerArg );.  
23450 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
23460 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
23470 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
23480 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c  NTL_BUSYHANDLER,
23490 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20   (void *)ap);.  
234a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
234b0 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
234c0 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
234d0 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
234e0 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
234f0 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
23500 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
23510 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
23520 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
23530 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
23540 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
23550 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
23560 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
23570 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
23580 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
23590 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
235a0 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
235b0 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
235c0 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
235d0 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
235e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
235f0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
23600 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
23610 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
23620 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
23630 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
23640 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
23650 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
23660 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
23670 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
23680 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
23690 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
236a0 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
236b0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
236c0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
236d0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
236e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
236f0 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
23700 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
23710 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
23720 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
23730 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
23740 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
23750 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
23760 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
23770 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
23780 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
23790 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
237a0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
237b0 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
237c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
237d0 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
237e0 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
237f0 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
23800 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
23810 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
23820 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
23830 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
23840 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
23850 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
23860 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
23870 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
23880 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
23890 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
238a0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
238b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
238c0 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
238d0 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
238e0 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
238f0 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
23900 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
23910 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
23920 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
23930 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
23940 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
23950 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
23960 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
23970 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
23980 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
23990 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
239a0 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
239b0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
239c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
239d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
239e0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
239f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
23a00 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
23a10 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
23a20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23a30 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
23a40 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
23a50 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
23a60 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
23a70 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
23a80 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
23a90 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
23aa0 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
23ab0 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
23ac0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
23ad0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
23ae0 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
23af0 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
23b00 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
23b10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
23b20 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
23b30 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
23b40 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
23b50 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
23b60 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
23b70 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
23b80 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
23b90 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
23ba0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23bb0 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
23bc0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
23bd0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
23be0 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
23bf0 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
23c00 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
23c10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
23c20 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
23c30 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
23c40 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
23c50 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
23c60 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
23c70 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
23c80 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
23c90 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
23ca0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
23cb0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
23cc0 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
23cd0 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
23ce0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
23cf0 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
23d00 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
23d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
23d20 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
23d30 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
23d40 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
23d50 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
23d60 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
23d70 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
23d80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23d90 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
23da0 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
23db0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
23dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23dd0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
23de0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
23df0 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
23e00 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
23e10 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
23e20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
23e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
23e50 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
23e60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23e70 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28  dbSize = (Pgno)(
23e80 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d  (nByte+pageSize-
23e90 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  1)/pageSize);.  
23ea0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
23eb0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
23ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
23ed0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
23ee0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
23ef0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
23f00 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
23f10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
23f20 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
23f30 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
23f40 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ize);.    }.  }.
23f50 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
23f60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23f70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
23f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
23f90 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
23fa0 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
23fb0 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
23fc0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
23fd0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
23fe0 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
23ff0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
24000 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
24010 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
24020 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61  (pPager);.    pa
24030 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70  gerFixMaplimit(p
24040 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
24050 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24060 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
24070 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f  er to the "tempo
24080 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65  rary page" buffe
24090 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c  r held internall
240a0 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65  y.** by the page
240b0 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75  r.  This is a bu
240c0 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67  ffer that is big
240d0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
240e0 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f  the.** entire co
240f0 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62  ntent of a datab
24100 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  ase page.  This 
24110 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69  buffer is used i
24120 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72  nternally.** dur
24130 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ing rollback and
24140 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
24150 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20  tten whenever a 
24160 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
24170 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  rs.  But other m
24180 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20  odules are free 
24190 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61  to use it too, a
241a0 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20  s long as.** no 
241b0 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61  rollbacks are ha
241c0 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  ppening..*/.void
241d0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65   *sqlite3PagerTe
241e0 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70  mpSpace(Pager *p
241f0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
24200 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
24210 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ce;.}../*.** Att
24220 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
24230 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65  maximum database
24240 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d   page count if m
24250 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
24260 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  e. .** Make no c
24270 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65  hanges if mxPage
24280 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
24290 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72  tive.  And never
242a0 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d   reduce the.** m
242b0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
242c0 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72  t below the curr
242d0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
242e0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
242f0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78  Regardless of mx
24300 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
24310 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
24320 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
24330 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24340 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67  MaxPageCount(Pag
24350 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24360 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
24370 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70  xPage>0 ){.    p
24380 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
24390 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73  mxPage;.  }.  as
243a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
243b0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
243c0 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c   );      /* Call
243d0 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61  ed only by OP_Ma
243e0 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65  xPgcnt */.  asse
243f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  rt( pPager->mxPg
24400 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no>=pPager->dbSi
24410 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78  ze );  /* OP_Max
24420 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74  Pgcnt enforces t
24430 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  his */.  return 
24440 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
24450 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
24460 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
24470 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
24480 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
24490 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
244a0 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
244b0 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
244c0 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
244d0 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
244e0 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
244f0 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
24500 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
24510 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
24520 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
24530 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
24540 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
24550 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
24560 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
24570 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
24580 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
24590 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
245a0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
245b0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
245c0 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
245d0 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
245e0 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
245f0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24600 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
24610 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
24620 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24630 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
24640 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
24650 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
24660 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
24670 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
24680 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24690 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
246a0 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
246b0 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
246c0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
246d0 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
246e0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
246f0 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
24700 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
24710 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
24720 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
24730 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
24740 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
24750 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
24760 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
24770 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
24780 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
24790 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
247a0 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
247b0 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
247c0 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
247d0 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
247e0 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
247f0 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
24800 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
24810 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
24820 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
24830 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
24840 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
24850 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
24860 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
24870 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
24880 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
24890 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
248a0 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
248b0 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
248c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
248d0 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
248e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
248f0 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
24900 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
24910 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24920 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
24930 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
24940 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
24950 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
24960 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
24970 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
24980 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
24990 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
249a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
249b0 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
249c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
249d0 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
249e0 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
249f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24a00 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
24a10 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54  pFile );..  /* T
24a20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
24a30 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74  nly called by bt
24a40 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ree immediately 
24a50 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20  after creating. 
24a60 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62   ** the Pager ob
24a70 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73  ject.  There has
24a80 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70   not been an opp
24a90 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e  ortunity to tran
24aa0 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57  sition.  ** to W
24ab0 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a  AL mode yet..  *
24ac0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
24ad0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
24ae0 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65   );..  if( isOpe
24af0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
24b00 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
24b10 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
24b20 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
24b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
24b40 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
24b50 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
24b60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24b70 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
24b80 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
24b90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24bc0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
24bd0 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
24be0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
24bf0 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a  ion is open on.*
24c00 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  * the pager. It 
24c10 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
24c20 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
24c30 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
24c40 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72  e..**.** However
24c50 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
24c60 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
24c70 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
24c80 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
24c90 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
24ca0 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
24cb0 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
24cc0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
24cd0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
24ce0 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
24cf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24d00 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
24d10 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
24d20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24d30 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
24d40 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a  _FINISHED );.  *
24d50 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50  pnPage = (int)pP
24d60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a  ager->dbSize;.}.
24d70 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
24d80 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
24d90 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
24da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24db0 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
24dc0 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
24dd0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
24de0 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
24df0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
24e00 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
24e10 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
24e20 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
24e30 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
24e40 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
24e50 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
24e60 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
24e70 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
24e80 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
24e90 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
24ea0 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
24eb0 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
24ec0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
24ed0 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
24ee0 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
24ef0 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
24f00 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
24f10 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
24f20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
24f30 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
24f40 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
24f50 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
24f60 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
24f70 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
24f80 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
24f90 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
24fa0 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
24fb0 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
24fc0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
24fd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
24fe0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
24ff0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25000 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
25010 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
25040 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e */..  /* Check
25050 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69   that this is ei
25060 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65  ther a no-op (be
25070 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73  cause the reques
25080 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a  ted lock is .  *
25090 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  * already held, 
250a0 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
250b0 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20  ansistions that 
250c0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
250d0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76  .  ** may be inv
250e0 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63  oked during, acc
250f0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  ording to the co
25100 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a  mment above.  **
25110 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
25120 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20  Busyhandler().. 
25130 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
25140 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f  Pager->eLock>=lo
25150 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c  cktype).       |
25160 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
25170 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  ==NO_LOCK && loc
25180 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
25190 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  CK).       || (p
251a0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  Pager->eLock==RE
251b0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c  SERVED_LOCK && l
251c0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
251d0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20  VE_LOCK).  );.. 
251e0 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70   do {.    rc = p
251f0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
25200 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  r, locktype);.  
25210 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
25220 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
25230 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
25240 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
25250 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65  dlerArg) );.  re
25260 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25270 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72  * Function asser
25280 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25290 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63  int(pPager) chec
252a0 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ks that one of t
252b0 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
252c0 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   is true for all
252d0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72   dirty pages cur
252e0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
252f0 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20  ge-cache:.**.** 
25300 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75    a) The page nu
25310 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
25320 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
25330 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
25340 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64  *      current d
25350 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
25360 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a  n pages, OR.**.*
25370 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61  *   b) if the pa
25380 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20  ge content were 
25390 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20  written at this 
253a0 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  time, it would n
253b0 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65  ot.**      be ne
253c0 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
253d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
253e0 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20  tent out to the 
253f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
25400 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e      (as determin
25410 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
25420 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25430 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ))..**.** If the
25440 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72   condition asser
25450 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
25460 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
25470 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  ue, and the.** d
25480 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74  irty page were t
25490 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66  o be discarded f
254a0 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69  rom the cache vi
254b0 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  a the pagerStres
254c0 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  s().** routine, 
254d0 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f  pagerStress() wo
254e0 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68  uld not write th
254f0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
25500 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ontent to.** the
25510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
25520 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74  If a savepoint t
25530 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20  ransaction were 
25540 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
25550 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e  r.** this happen
25560 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  ed, the correct 
25570 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62  behavior would b
25580 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
25590 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
255a0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
255b0 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
255c0 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
255d0 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
255e0 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
255f0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
25600 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
25610 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
25620 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
25630 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
25640 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
25650 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
25660 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
25670 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
25680 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
25690 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
256a0 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
256b0 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
256c0 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
256d0 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
256e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
256f0 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
25700 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25710 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
25720 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
25730 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
25740 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
25750 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
25760 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
25770 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
25780 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
25790 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
257a0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
257b0 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
257c0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
257d0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
257e0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
257f0 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
25800 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
25810 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
25820 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
25830 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
25840 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
25850 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
25860 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
25870 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
25880 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
25890 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
258a0 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
258b0 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
258c0 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
258d0 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
258e0 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
258f0 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
25900 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
25910 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
25920 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
25930 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
25940 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
25950 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
25960 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25970 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
25980 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63  d right before c
25990 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
259a0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65  saction..** Once
259b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
259c0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  as been called, 
259d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
259e0 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a  must either be.*
259f0 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72  * rolled back or
25a00 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69   committed. It i
25a10 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61  s not safe to ca
25a20 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
25a30 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e   and.** then con
25a40 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f  tinue writing to
25a50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
25a60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25a70 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
25a80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25a90 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
25aa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
25ab0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
25ac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25ad0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
25ae0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
25af0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
25b00 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20  ize = nPage;..  
25b10 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
25b20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61  the code here ca
25b30 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63  lled assertTrunc
25b40 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
25b50 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74  to.  ** ensure t
25b60 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65  hat all pages be
25b70 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77  ing truncated aw
25b80 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ay by this opera
25b90 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69  tion are,.  ** i
25ba0 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  f one or more sa
25bb0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65  vepoints are ope
25bc0 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  n, present in th
25bd0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
25be0 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  * journal so tha
25bf0 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65  t they can be re
25c00 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61  stored if the sa
25c10 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65  vepoint is rolle
25c20 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69  d.  ** back. Thi
25c30 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  s is no longer n
25c40 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73  ecessary as this
25c50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
25c60 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65   only.  ** calle
25c70 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63  d right before c
25c80 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
25c90 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68  saction. So alth
25ca0 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50  ough the .  ** P
25cb0 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20  ager object may 
25cc0 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20  still have open 
25cd0 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65  savepoints (Page
25ce0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29  r.nSavepoint!=0)
25cf0 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e  , .  ** they can
25d00 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
25d10 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72  ck. So the asser
25d20 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25d30 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20  int() call.  ** 
25d40 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72  is no longer cor
25d50 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  rect. */.}.../*.
25d60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25d70 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
25d80 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
25d90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
25da0 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
25db0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25dc0 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
25dd0 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
25de0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
25df0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
25e00 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
25e10 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
25e20 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
25e30 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
25e40 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
25e50 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
25e60 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
25e70 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
25e80 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
25e90 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
25ea0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
25eb0 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
25ec0 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
25ed0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
25ee0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
25ef0 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
25f00 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
25f10 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
25f20 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
25f30 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
25f40 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
25f50 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
25f60 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
25f70 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
25f80 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
25f90 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
25fa0 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
25fb0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
25fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
25fd0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
25fe0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
25ff0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26000 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
26010 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
26020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26030 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
26040 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
26050 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
26060 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26070 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
26080 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
26090 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
260a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
260b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
260c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  rc;.}../*.** Obt
260d0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
260e0 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70  to a memory mapp
260f0 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66  ed page object f
26100 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  or page number p
26110 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77  gno. .** The new
26120 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65   object will use
26130 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61   the pointer pDa
26140 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ta, obtained fro
26150 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49  m xFetch()..** I
26160 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
26170 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69  t *ppPage to poi
26180 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
26190 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  ge reference.** 
261a0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
261b0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
261c0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
261d0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
261e0 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20   set.** *ppPage 
261f0 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50  to zero..**.** P
26200 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f  age references o
26210 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
26220 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
26230 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61   should be relea
26240 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e  sed.** by callin
26250 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  g pagerReleaseMa
26260 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
26270 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
26280 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61  ireMapPage(.  Pa
26290 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262b0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
262c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
262f0 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61  r */.  void *pDa
26300 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
26310 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
26320 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68  ()'d data for th
26330 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
26340 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  dr **ppPage     
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26360 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61  OUT: Acquired pa
26370 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ge object */.){.
26380 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
263b0 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72  ed page to retur
263c0 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
263d0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
263e0 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
263f0 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
26400 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
26410 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
26420 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
26430 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
26440 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  ty = 0;.    mems
26450 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c  et(p->pExtra, 0,
26460 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
26470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
26480 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67  ppPage = p = (Pg
26490 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  Hdr *)sqlite3Mal
264a0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
264b0 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e  gHdr) + pPager->
264c0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28  nExtra);.    if(
264d0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
264e0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
264f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
26500 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
26510 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
26520 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
26530 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
26540 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
26550 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
26560 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
26570 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
26580 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
26590 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
265a0 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
265b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
265c0 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
265d0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
265e0 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
265f0 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
26600 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
26610 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26620 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
26630 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
26640 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
26650 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
26660 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
26670 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26680 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
26690 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
266a0 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
266b0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
266c0 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
266d0 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
266e0 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
266f0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
26700 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
26710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26720 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
26730 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
26740 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
26750 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
26760 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26770 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
26780 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
26790 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
267a0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
267b0 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
267c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
267d0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
267e0 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
267f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
26800 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
26810 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
26820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26830 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
26840 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
26850 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
26860 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
26870 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
26880 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
26890 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
268a0 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
268b0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
268c0 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
268d0 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
268e0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
268f0 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
26900 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
26910 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
26920 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(p);.  }.}...
26930 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
26940 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
26950 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
26960 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
26970 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
26980 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
26990 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
269a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
269b0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
269c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
269d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
269e0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
269f0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
26a00 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
26a10 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
26a20 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
26a30 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
26a40 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
26a50 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
26a60 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
26a70 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
26a80 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
26a90 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
26aa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
26ab0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
26ac0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
26ad0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
26ae0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
26af0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
26b00 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
26b10 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
26b20 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
26b30 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
26b40 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
26b50 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
26b60 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
26b70 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
26b80 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
26b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
26ba0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
26bb0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
26bc0 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
26bd0 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
26be0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
26bf0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
26c00 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
26c10 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
26c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
26c30 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
26c40 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
26c50 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
26c60 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
26c70 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
26c80 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
26c90 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
26ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
26cb0 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
26cc0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
26cd0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
26ce0 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61  lags, pPager->pa
26cf0 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20  geSize, pTmp);. 
26d00 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
26d10 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
26d20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
26d30 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
26d40 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
26d50 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
26d60 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
26d70 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
26d80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
26d90 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
26da0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
26db0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
26dc0 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
26dd0 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
26de0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
26df0 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
26e00 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
26e10 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
26e20 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
26e30 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
26e40 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
26e50 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
26e60 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
26e70 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
26e80 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
26e90 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
26ea0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
26eb0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
26ec0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
26ed0 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
26ee0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
26ef0 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
26f00 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
26f10 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
26f20 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
26f30 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
26f40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26f50 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
26f60 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
26f70 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
26f80 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
26f90 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
26fa0 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
26fb0 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
26fc0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
26fd0 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
26fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26ff0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
27000 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27010 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
27020 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
27030 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
27040 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
27050 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
27060 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
27070 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
27080 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
27090 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
270a0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
270b0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
270c0 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
270d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
270e0 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
270f0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
27100 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
27110 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27120 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
27130 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
27140 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
27150 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
27160 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
27170 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
27180 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
27190 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
271a0 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
271b0 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
271c0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
271d0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
271e0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
271f0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
27200 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
27210 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
27220 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
27230 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27240 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
27250 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
27260 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
27270 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
27280 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
27290 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
272a0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
272b0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
272c0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
272d0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
272e0 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
272f0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
27300 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
27310 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
27320 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
27330 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
27340 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
27350 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
27360 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27370 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
27380 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
27390 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
273a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
273b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
273c0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
273d0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
273e0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
273f0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
27400 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
27410 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
27420 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
27430 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
27440 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
27450 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
27460 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
27470 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
27480 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
27490 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
274a0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
274b0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
274c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
274d0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
274e0 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
274f0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
27500 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
27510 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
27520 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
27530 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
27540 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
27550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27560 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
27570 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
27580 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
27590 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
275a0 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
275b0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
275c0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
275d0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
275e0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
275f0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
27600 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
27610 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
27620 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
27630 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
27640 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
27650 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
27660 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
27670 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
27680 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
27690 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
276a0 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
276b0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
276c0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
276d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
276e0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
276f0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
27700 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
27710 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
27720 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
27730 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
27740 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
27750 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
27760 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
27770 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
27780 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
27790 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
277a0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
277b0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
277c0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
277d0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
277e0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
277f0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
27800 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
27810 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
27820 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
27830 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
27840 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
27850 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
27860 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
27870 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
27880 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
27890 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
278a0 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
278b0 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
278c0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
278d0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
278e0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
278f0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
27900 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
27910 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
27920 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
27930 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
27940 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
27950 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
27960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
27970 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
27980 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
27990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
279a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
279b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
279c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
279d0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
279e0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
279f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
27a00 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
27a10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
27a20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
27a30 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
27a40 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
27a50 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
27a60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27a70 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
27a80 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
27a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
27aa0 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
27ab0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
27ac0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
27ad0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
27ae0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
27af0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27b00 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
27b10 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
27b20 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
27b30 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
27b40 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
27b50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
27b60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
27b70 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
27b80 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
27b90 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
27ba0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
27bb0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
27bc0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
27bd0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
27be0 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
27bf0 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
27c00 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
27c10 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
27c20 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
27c30 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
27c40 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
27c50 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
27c60 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
27c70 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
27c80 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
27c90 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
27ca0 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
27cb0 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
27cc0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
27cd0 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
27ce0 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
27cf0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
27d00 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
27d10 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
27d20 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
27d30 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
27d40 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
27d50 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
27d60 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
27d70 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
27d80 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
27d90 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
27da0 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
27db0 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
27dc0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
27dd0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
27de0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
27df0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27e00 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
27e10 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
27e20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
27e30 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
27e40 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
27e50 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
27e60 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
27e70 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
27e80 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
27e90 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
27ea0 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
27eb0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
27ec0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
27ed0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
27ee0 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
27ef0 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
27f00 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
27f10 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
27f20 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
27f30 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
27f40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
27f50 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
27f60 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
27f70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
27f80 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
27f90 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
27fa0 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
27fb0 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
27fc0 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
27fd0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
27fe0 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
27ff0 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
28000 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
28010 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
28020 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
28030 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
28040 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
28050 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
28060 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
28070 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
28080 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
28090 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
280a0 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
280b0 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
280c0 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
280d0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
280e0 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
280f0 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
28100 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
28110 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
28120 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
28130 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28140 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
28150 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
28160 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
28170 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
28180 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28190 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
281a0 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
281b0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
281c0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
281d0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
281e0 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
281f0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
28200 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
28210 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
28220 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
28230 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
28240 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
28250 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28260 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
28270 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
28280 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
28290 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
282a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
282b0 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
282c0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
282d0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
282e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
282f0 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
28300 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28310 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
28320 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
28330 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
28340 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
28350 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
28370 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
28380 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
28390 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
283a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
283b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
283c0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
283d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
283e0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
283f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
28400 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
28410 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
28420 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
28430 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
28440 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
28450 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
28460 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
28470 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
28480 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
28490 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
284a0 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
284b0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
284c0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
284d0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
284e0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
284f0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
28500 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
28510 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
28520 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
28530 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
28540 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
28550 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
28560 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
28570 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
28580 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
28590 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
285a0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
285b0 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
285c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
285d0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
285e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
285f0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
28600 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
28610 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
28620 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
28630 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
28640 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
28650 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
28660 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28670 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
28680 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28690 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
286a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
286b0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
286c0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
286d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
286e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
286f0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
28700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28720 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
28740 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
28750 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
28760 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28770 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
28780 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28790 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
287a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
287b0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
287c0 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
287d0 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
287e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
287f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28810 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
28820 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28830 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
28840 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
28850 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
28860 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
28870 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
28880 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
28890 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
288a0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
288b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
288c0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
288d0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
288e0 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
288f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28900 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
28910 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
28920 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
28930 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
28940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28950 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28960 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
28970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
28980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28990 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
289a0 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
289b0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
289c0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
289d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
289e0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
289f0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
28a00 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
28a10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28a20 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28a30 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
28a50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28a60 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
28a70 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
28a80 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
28a90 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
28aa0 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
28ab0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
28ac0 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
28ad0 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
28ae0 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
28af0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
28b00 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
28b10 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
28b20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
28b30 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
28b40 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
28b50 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
28b60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
28b70 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
28b80 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
28b90 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
28ba0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28bb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28bc0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
28bd0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
28be0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
28bf0 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
28c00 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
28c10 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
28c20 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
28c30 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
28c40 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
28c50 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
28c60 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
28c70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
28c80 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
28c90 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
28ca0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
28cb0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
28cc0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
28cd0 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
28ce0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
28cf0 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
28d00 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
28d10 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
28d20 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
28d30 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
28d40 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
28d50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28d60 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
28d70 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
28d80 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
28d90 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
28da0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
28db0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
28dc0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
28dd0 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
28de0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
28df0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
28e00 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
28e10 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
28e20 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
28e30 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
28e40 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
28e50 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
28e60 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
28e70 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
28e80 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
28e90 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
28ea0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
28eb0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
28ec0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
28ed0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
28ee0 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
28ef0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
28f00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28f10 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
28f20 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
28f30 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
28f40 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
28f50 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
28f60 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
28f70 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
28f80 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
28f90 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
28fa0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
28fb0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
28fc0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
28fd0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
28fe0 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
28ff0 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
29000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29010 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
29020 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
29030 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
29040 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
29050 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
29060 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
29070 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
29080 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
29090 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
290a0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
290b0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
290c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
290d0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
290e0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
290f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
29100 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
29110 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
29120 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
29130 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
29140 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
29150 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
29160 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
29170 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
29180 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
29190 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
291a0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
291b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
291c0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
291d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
291e0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
291f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29200 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
29210 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
29220 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
29230 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
29240 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
29250 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
29260 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
29270 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
29280 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
29290 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
292a0 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
292b0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
292c0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
292d0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
292e0 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
292f0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
29300 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
29310 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
29320 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
29330 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
29340 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
29350 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
29360 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
29370 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
29380 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
29390 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
293a0 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
293b0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
293c0 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
293d0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
293e0 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
293f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
29400 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
29410 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
29420 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
29430 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
29440 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
29450 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
29460 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
29470 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
29480 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
29490 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
294a0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
294b0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
294c0 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
294d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
294e0 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
294f0 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65  dbHintSize<pPage
29500 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20  r->dbSize.   && 
29510 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c  (pList->pDirty |
29520 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50  | pList->pgno>pP
29530 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
29540 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
29550 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
29560 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
29570 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
29580 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
29590 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
295a0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
295b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
295c0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
295d0 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
295e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
295f0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
29600 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
29610 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
29620 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
29630 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
29640 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
29650 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
29660 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
29670 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
29680 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
29690 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
296a0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
296b0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
296c0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
296d0 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
296e0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
296f0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
29700 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
29710 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
29720 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
29730 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
29740 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
29750 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
29760 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
29770 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
29780 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
29790 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
297a0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
297b0 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
297c0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
297d0 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
297e0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
297f0 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
29800 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
29810 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
29820 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
29830 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
29840 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
29850 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
29860 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
29870 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
298b0 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
298c0 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
298d0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
298e0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
298f0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
29900 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
29910 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
29920 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
29930 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
29940 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
29950 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
29960 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
29970 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
29980 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
29990 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
299a0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
299b0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
299c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
299d0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
299e0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
299f0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
29a00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
29a10 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
29a20 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
29a30 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
29a40 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
29a50 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
29a60 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
29a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
29a80 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
29a90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
29aa0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
29ab0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
29ac0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
29ad0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
29ae0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
29af0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
29b00 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
29b10 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
29b20 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
29b30 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
29b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29b50 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
29b60 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
29b70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
29b80 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
29b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
29ba0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
29bb0 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a  _STAT_WRITE]++;.
29bc0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
29bd0 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
29be0 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
29bf0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
29c00 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
29c10 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
29c20 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
29c30 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
29c40 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
29c50 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
29c60 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
29c70 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
29c80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29c90 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
29ca0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
29cb0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
29cc0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
29cd0 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
29ce0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
29cf0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
29d00 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
29d10 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
29d20 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  unt);.    }else{
29d30 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
29d40 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
29d50 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
29d60 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
29d70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
29d80 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
29d90 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
29da0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
29db0 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
29dc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
29dd0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
29de0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29df0 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
29e00 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
29e10 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
29e20 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
29e30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
29e40 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
29e50 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
29e60 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
29e70 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
29e80 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
29e90 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
29ea0 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
29eb0 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
29ec0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
29ed0 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
29ee0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
29ef0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
29f00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
29f10 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29f20 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
29f30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29f40 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
29f50 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
29f60 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
29f70 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
29f80 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
29f90 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
29fa0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
29fb0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29fc0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
29fd0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
29fe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
29ff0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
2a000 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a010 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2a020 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2a030 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2a040 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2a050 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2a060 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
2a070 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
2a080 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
2a090 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
2a0a0 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
2a0b0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
2a0c0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
2a0d0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
2a0e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
2a0f0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
2a100 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
2a110 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
2a120 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
2a130 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
2a140 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
2a150 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2a160 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
2a170 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
2a180 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
2a190 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
2a1a0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
2a1b0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
2a1c0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
2a1d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
2a1e0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
2a1f0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
2a200 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
2a210 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
2a220 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
2a230 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
2a240 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2a250 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
2a260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a270 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
2a280 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2a290 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
2a2a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2a2b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a2c0 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
2a2d0 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
2a2e0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
2a2f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
2a300 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
2a310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a320 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2a330 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2a340 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
2a350 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
2a360 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
2a370 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a380 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
2a390 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
2a3a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a3b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2a3c0 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
2a3d0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2a3e0 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20  ager, pPg) .    
2a3f0 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
2a400 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
2a410 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
2a420 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
2a430 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
2a440 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2a450 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
2a460 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
2a470 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
2a480 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
2a490 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
2a4a0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2a4b0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
2a4c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a4d0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
2a4e0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
2a4f0 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
2a500 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67  fset = (i64)pPag
2a510 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
2a520 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2a530 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
2a540 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
2a550 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
2a560 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
2a570 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
2a580 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
2a590 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2a5a0 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2a5b0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2a5c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2a5d0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2a5e0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2a5f0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2a600 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2a610 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2a620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a630 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2a640 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2a650 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2a660 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2a670 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2a680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a690 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2a6a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2a6b0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2a6c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a6d0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2a6e0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2a6f0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2a700 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2a710 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2a720 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a730 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a740 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
2a750 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
2a760 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
2a770 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
2a780 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
2a790 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
2a7a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2a7b0 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
2a7c0 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
2a7d0 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
2a7e0 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
2a7f0 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
2a800 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
2a810 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
2a820 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
2a830 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
2a840 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
2a850 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
2a860 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
2a870 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
2a880 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
2a890 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
2a8a0 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
2a8b0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
2a8c0 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
2a8d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
2a8e0 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
2a8f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
2a900 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
2a910 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
2a920 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
2a930 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a940 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
2a950 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
2a960 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
2a970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
2a980 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2a990 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
2a9a0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2a9b0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
2a9c0 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
2a9d0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2a9e0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2a9f0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2aa00 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
2aa10 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
2aa20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2aa30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
2aa40 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
2aa50 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
2aa60 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
2aa70 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
2aa80 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
2aa90 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2aaa0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2aab0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2aac0 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
2aad0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2aae0 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
2aaf0 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
2ab00 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2ab10 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
2ab20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ab30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2ab40 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
2ab50 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
2ab60 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
2ab70 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
2ab80 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   /* The doNotSpi
2ab90 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73  ll NOSYNC bit is
2aba0 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65   set during time
2abb0 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73  s when doing a s
2abc0 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72  ync of.  ** jour
2abd0 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20  nal (and adding 
2abe0 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73  a new header) is
2abf0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54   not allowed.  T
2ac00 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  his occurs.  ** 
2ac10 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20  during calls to 
2ac20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ac30 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67  e() while trying
2ac40 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74   to journal mult
2ac50 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  iple.  ** pages 
2ac60 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
2ac70 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20   same sector..  
2ac80 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f  **.  ** The doNo
2ac90 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  tSpill ROLLBACK 
2aca0 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68  and OFF bits inh
2acb0 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
2acc0 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65  spilling.  ** re
2acd0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2ace0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e  her or not a syn
2acf0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  c is required.  
2ad00 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69  This is set duri
2ad10 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  ng.  ** a rollba
2ad20 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65  ck or by user re
2ad30 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76  quest, respectiv
2ad40 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ely..  **.  ** S
2ad50 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
2ad60 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
2ad70 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
2ad80 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
2ad90 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
2ada0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
2adb0 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
2adc0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2add0 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
2ade0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2adf0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2ae00 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2ae10 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2ae20 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
2ae30 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2ae40 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2ae50 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2ae60 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2ae70 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2ae80 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2ae90 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2aea0 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2aeb0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2aec0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2aed0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2aee0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2aef0 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2af00 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2af10 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2af20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2af30 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2af40 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2af50 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2af60 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2af70 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2af80 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2af90 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2afa0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2afb0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2afc0 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2afd0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2afe0 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2aff0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b000 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2b010 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2b020 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2b030 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2b040 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2b050 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2b060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b070 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2b080 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2b090 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b0a0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2b0b0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2b0c0 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2b0d0 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2b0e0 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
2b0f0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2b100 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62   .      rc = sub
2b110 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2b120 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ; .    }.    if(
2b130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2b150 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2b160 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2b170 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b180 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2b190 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b1a0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2b1b0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2b1c0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2b1d0 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2b1e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2b1f0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2b200 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2b210 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2b220 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2b230 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2b240 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2b250 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
2b260 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
2b270 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
2b280 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2b290 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
2b2a0 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
2b2b0 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
2b2c0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68  urnal..    ** Th
2b2d0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
2b2e0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
2b2f0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
2b300 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
2b310 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
2b320 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
2b330 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  e file in this c
2b340 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ase..    **.    
2b350 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
2b360 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
2b370 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
2b380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45    **.    **   BE
2b390 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
2b3a0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
2b3b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  .    **     <mod
2b3c0 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20  ify page X>.    
2b3d0 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
2b3e0 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20   sp;.    **     
2b3f0 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61    <shrink databa
2b400 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67  se file to Y pag
2b410 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  es>.    **      
2b420 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
2b430 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X).    **     
2b440 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
2b450 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
2b460 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
2b470 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
2b480 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
2b490 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
2b4a0 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  en.    ** out to
2b4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b4c0 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
2b4d0 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
2b4e0 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
2b4f0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
2b500 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
2b510 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
2b520 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
2b530 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64  ll read.    ** d
2b540 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
2b550 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
2b560 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
2b570 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
2b580 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65  t.    ** was whe
2b590 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2b5a0 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61  n started, not a
2b5b0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53  s it was when "S
2b5c0 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20  AVEPOINT sp".   
2b5d0 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
2b5e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b5f0 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
2b600 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
2b610 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61  rent data for pa
2b620 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20  ge X into the . 
2b630 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61     ** sub-journa
2b640 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
2b650 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2b660 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
2b670 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   it will.    ** 
2b680 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
2b690 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
2b6a0 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
2b6b0 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
2b6c0 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a     ** executed..
2b6d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
2b6e0 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63  EVER(.        rc
2b6f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2b700 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2b710 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
2b720 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
2b730 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20  .    ) ){.      
2b740 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2b750 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
2b760 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
2b770 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2b780 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
2b790 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b7a0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
2b7b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
2b7d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2b7e0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2b7f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b800 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2b810 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
2b820 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
2b830 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
2b840 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
2b850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b860 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b870 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
2b880 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b890 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2b8a0 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
2b8b0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b8c0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
2b8d0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
2b8e0 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
2b8f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2b900 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2b910 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2b920 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2b930 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2b940 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2b950 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2b960 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2b970 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2b980 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2b990 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2b9a0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2b9b0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2b9c0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2b9d0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2b9e0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2b9f0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2ba00 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2ba10 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2ba20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2ba30 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2ba40 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2ba50 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2ba60 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2ba70 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2ba80 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2ba90 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2baa0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2bab0 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2bac0 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2bad0 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2bae0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2baf0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2bb00 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2bb10 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2bb20 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2bb30 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2bb40 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2bb50 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2bb60 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2bb70 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2bb80 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2bb90 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2bba0 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2bbb0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2bbc0 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2bbd0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2bbe0 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
2bbf0 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2bc00 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2bc10 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2bc20 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2bc30 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2bc40 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2bc50 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2bc60 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2bc70 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2bc80 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2bc90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2bca0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2bcb0 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2bcc0 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2bcd0 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2bce0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2bcf0 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2bd00 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2bd10 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2bd20 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2bd30 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2bd40 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2bd50 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2bd60 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2bd70 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2bd80 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2bd90 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2bda0 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2bdb0 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2bdc0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bdd0 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2bde0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2bdf0 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2be00 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2be10 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2be20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2be30 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2be40 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2be50 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2be60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2be70 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2be80 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2be90 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2bea0 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2beb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2bec0 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2bed0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2bee0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2bef0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2bf00 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2bf10 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2bf20 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2bf30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2bf40 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2bf50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2bf60 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2bf70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2bf80 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2bf90 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2bfa0 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2bfb0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2bfc0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2bfe0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2bff0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2c000 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2c010 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2c020 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2c030 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2c040 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2c050 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2c060 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2c070 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2c080 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2c090 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2c0a0 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2c0b0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2c0c0 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2c0d0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2c0e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c0f0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2c100 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2c110 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2c120 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2c130 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2c140 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2c150 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2c160 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2c170 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c180 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2c190 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2c1a0 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2c1b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c1c0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2c1d0 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2c1e0 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2c1f0 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2c200 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c210 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2c220 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2c230 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2c240 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2c250 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2c260 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2c270 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2c280 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c290 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2c2a0 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2c2b0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2c2c0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2c2d0 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2c2e0 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2c2f0 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2c300 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2c310 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2c320 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2c330 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2c340 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2c350 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2c360 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2c370 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2c380 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2c390 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2c3a0 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2c3b0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2c3c0 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2c3d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c3e0 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2c3f0 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2c400 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2c410 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2c420 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2c430 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2c440 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2c450 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2c460 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2c470 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2c480 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
2c490 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
2c4a0 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
2c4b0 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
2c4c0 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
2c4d0 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
2c4e0 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
2c4f0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
2c500 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
2c510 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
2c520 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
2c530 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
2c540 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
2c550 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
2c560 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
2c570 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
2c580 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
2c590 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2c5a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
2c5b0 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
2c5c0 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
2c5d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
2c5e0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c5f0 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
2c600 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
2c610 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c620 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c630 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
2c640 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
2c650 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
2c660 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2c670 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2c680 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
2c690 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2c6a0 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2c6b0 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2c6c0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2c6d0 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2c6e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c6f0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2c700 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2c710 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2c720 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2c730 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c740 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c750 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2c760 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2c770 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2c780 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2c790 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2c7a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c7b0 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d       nPathname =
2c7c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c7d0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2c7e0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2c7f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2c800 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2c810 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2c820 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2c830 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2c840 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2c850 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2c860 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2c870 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2c880 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2c890 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2c8a0 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2c8b0 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2c8c0 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2c8d0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c8e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c8f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c900 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2c910 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2c920 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2c930 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ame = sqlite3DbM
2c940 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74  allocRaw(0, nPat
2c950 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2c960 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2c970 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2c980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c990 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2c9a0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2c9b0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2c9c0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2c9d0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2c9e0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2c9f0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2ca00 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2ca10 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2ca20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2ca30 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2ca40 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2ca50 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2ca60 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2ca70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ca80 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2ca90 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2caa0 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2cab0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2cac0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2cad0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2cae0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2caf0 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2cb00 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2cb10 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2cb20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cb30 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2cb40 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2cb50 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2cb60 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2cb70 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2cb80 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2cb90 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2cba0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2cbb0 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2cbc0 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2cbd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2cbe0 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2cbf0 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2cc00 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2cc10 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2cc20 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2cc30 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2cc40 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2cc50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2cc60 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2cc70 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2cc80 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2cc90 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2cca0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ccb0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2ccc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ccd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2ccf0 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2cd00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2cd10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2cd20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2cd30 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2cd40 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2cd50 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2cd60 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2cd70 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2cd80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2cd90 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2cda0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2cdb0 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2cdc0 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2cdd0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2cde0 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2cdf0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2ce00 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2ce10 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2ce20 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2ce30 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2ce40 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2ce50 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2ce60 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2ce70 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2ce80 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2ce90 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2cea0 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2ceb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2cec0 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2ced0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2cee0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2cef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2cf00 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2cf10 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2cf20 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2cf30 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2cf50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2cf60 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2cf70 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2cf80 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2cf90 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2cfa0 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2cfb0 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2cfc0 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2cfd0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2cfe0 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2cff0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2d000 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2d010 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2d020 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2d030 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2d040 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2d050 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2d060 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2d070 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2d080 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2d090 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2d0a0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2d0b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d0c0 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2d0d0 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2d0e0 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2d0f0 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2d100 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2d110 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2d120 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2d130 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2d140 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2d150 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2d160 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2d170 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d180 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2d190 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2d1a0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2d1b0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2d1c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d1d0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d1e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d1f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
2d200 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2d210 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2d220 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2d230 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2d240 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d250 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d260 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2d270 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2d280 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2d290 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d2a0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2d2b0 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2d2c0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2d2d0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d2e0 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2d2f0 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2d300 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2d310 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2d320 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2d330 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2d340 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d350 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2d360 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2d370 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2d380 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2d390 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2d3a0 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2d3b0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2d3c0 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2d3d0 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2d3e0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2d3f0 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2d400 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2d410 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2d420 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d430 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d440 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d450 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2d460 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2d470 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d480 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2d490 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2d4a0 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2d4b0 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2d4c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d4d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2d4e0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d4f0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d500 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d510 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2d520 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2d530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d540 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d550 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d560 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2d570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d580 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2d590 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2d5a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d5b0 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2d5c0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d5d0 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2d5e0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d5f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d600 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2d610 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2d620 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2d630 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d640 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d650 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2d660 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2d670 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d680 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2d690 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2d6a0 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2d6b0 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2d6c0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2d6d0 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2d6e0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2d6f0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2d700 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2d710 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d720 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2d730 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2d740 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2d750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2d760 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2d770 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d780 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2d790 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2d7a0 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2d7b0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2d7c0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2d7d0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2d7e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2d7f0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2d800 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2d810 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2d820 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2d830 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d840 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2d850 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2d860 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2d870 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2d880 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2d890 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2d8a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2d8b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d8c0 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2d8d0 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2d8e0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2d8f0 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2d900 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2d910 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2d920 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2d930 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2d940 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2d950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d960 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
2d970 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2d980 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2d990 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2d9a0 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f        if( !readO
2d9b0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nly ){.        s
2d9c0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2d9d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
2d9e0 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2d9f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2da00 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2da10 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2da20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2da30 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2da40 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2da50 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2da60 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2da70 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2da80 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2da90 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2daa0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2dab0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2dac0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
2dad0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2dae0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2daf0 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2db00 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2db10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  }.        }.#ifd
2db20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2db30 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2db40 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2db50 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2db60 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2db70 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2db80 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2db90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2dba0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2dbb0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2dbc0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2dbd0 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2dbe0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2dbf0 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2dc00 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2dc10 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2dc20 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2dc30 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2dc40 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
2dc50 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2dc60 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2dc70 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2dc80 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2dc90 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2dca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2dcb0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
2dcc0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
2dcd0 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2dce0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  = sqlite3_uri_bo
2dcf0 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2dd00 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20   "nolock", 0);. 
2dd10 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20       if( (iDc & 
2dd20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d  SQLITE_IOCAP_IMM
2dd30 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20  UTABLE)!=0.     
2dd40 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69    || sqlite3_uri
2dd50 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2dd60 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c  me, "immutable",
2dd70 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
2dd80 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c   vfsFlags |= SQL
2dd90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2dda0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
2ddb0 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f  o act_like_temp_
2ddc0 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  file;.      }.  
2ddd0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2dde0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2ddf0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2de00 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2de10 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2de20 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2de30 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2de40 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2de50 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2de60 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2de70 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2de80 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2de90 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2dea0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2deb0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2dec0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2ded0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2dee0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2def0 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2df00 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2df10 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2df20 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2df30 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2df40 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2df50 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2df60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2df70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2df80 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72  is branch also r
2df90 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61  uns for files ma
2dfa0 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c  rked as immutabl
2dfb0 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c  e..    */ .act_l
2dfc0 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20  ike_temp_file:. 
2dfd0 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2dfe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2dff0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2e000 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65  ER;     /* Prete
2e010 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  nd we already ha
2e020 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ve a lock */.   
2e030 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2e040 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2e050 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2e060 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49  e are in EXCLUSI
2e070 56 45 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  VE locking mode 
2e080 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2e090 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2e0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2e0b0 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2e0c0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2e0d0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2e0e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2e0f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2e100 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2e110 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2e120 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2e130 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2e140 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2e150 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2e160 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2e170 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2e180 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2e1a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2e1b0 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2e1c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2e1d0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2e1e0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2e1f0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2e200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e210 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e220 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e230 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
2e240 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
2e250 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
2e260 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2e270 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2e280 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2e290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e2a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2e2b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
2e2c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
2e2d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2e2e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2e2f0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2e300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e310 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e320 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2e330 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
2e340 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2e350 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2e360 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
2e370 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2e380 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2e390 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2e3b0 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2e3c0 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2e3d0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2e3e0 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
2e3f0 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2e400 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2e410 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2e420 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e430 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2e440 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2e450 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2e460 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2e470 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2e480 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2e490 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2e4a0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2e4b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e4c0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2e4d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2e4e0 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2e4f0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2e500 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e510 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2e520 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e530 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2e540 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2e550 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2e560 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2e570 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2e580 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2e590 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2e5a0 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2e5b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e5c0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2e5e0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2e5f0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2e600 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2e610 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e620 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2e630 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2e640 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e650 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2e660 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2e670 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2e680 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2e690 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2e6a0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2e6b0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2e6c0 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2e6d0 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2e6e0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2e6f0 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2e700 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2e710 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e720 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2e730 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2e740 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2e750 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2e760 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e770 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2e780 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e790 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e7a0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e7b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2e7c0 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2e7d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e7e0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2e7f0 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2e800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2e810 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2e820 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2e830 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e840 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2e850 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2e860 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e870 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2e880 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2e890 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2e8a0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e8b0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2e8c0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2e8d0 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2e8e0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2e8f0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2e900 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2e910 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2e920 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2e930 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2e940 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2e950 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2e960 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2e970 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2e980 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2e990 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2e9a0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2e9b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2e9c0 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2e9d0 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2e9e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2e9f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ea00 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2ea10 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2ea20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ea30 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2ea40 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2ea50 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2ea60 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2ea70 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ea80 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2ea90 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2eaa0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2eab0 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2eac0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2ead0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2eae0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2eaf0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2eb00 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2eb10 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2eb20 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2eb30 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2eb40 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2eb50 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2eb60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2eb70 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2eb80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2eb90 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2eba0 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2ebb0 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2ebc0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2ebd0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2ebe0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2ebf0 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2ec00 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2ec10 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2ec20 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2ec30 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2ec40 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2ec50 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2ec60 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2ec70 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ec80 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2ec90 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2eca0 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2ecb0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2ecc0 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2ecd0 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2ece0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2ecf0 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2ed00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ed10 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2ed20 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2ed30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2ed40 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2ed50 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2ed60 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2ed70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2ed80 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2ed90 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2eda0 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2edb0 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2edc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2edd0 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2ede0 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2edf0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2ee00 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2ee10 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2ee20 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2ee30 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2ee40 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2ee50 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2ee60 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2ee70 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2ee80 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2ee90 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2eea0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2eeb0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2eec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2eed0 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2eee0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2eef0 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2ef00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ef10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2ef20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ef30 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2ef40 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2ef50 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2ef60 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2ef70 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2ef80 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2ef90 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2efa0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2efb0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2efc0 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2efd0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2efe0 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2eff0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2f000 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2f010 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2f020 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2f030 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2f040 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2f050 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2f060 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2f070 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2f080 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2f090 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2f0a0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f0b0 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2f0c0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2f0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f0e0 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2f0f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2f100 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2f110 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2f120 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2f130 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2f140 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f150 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2f160 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2f170 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2f180 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2f190 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2f1a0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2f1b0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2f1c0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2f1d0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2f1e0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2f1f0 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2f200 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2f210 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2f220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f230 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2f240 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2f250 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2f260 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2f270 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2f280 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2f290 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2f2a0 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2f2b0 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2f2c0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2f2d0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2f2e0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2f2f0 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2f300 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f310 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2f320 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2f330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f340 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2f350 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2f360 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2f370 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2f380 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2f390 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2f3a0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2f3b0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2f3c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f3d0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f3e0 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2f3f0 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2f400 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2f410 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2f420 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2f430 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f440 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2f450 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2f460 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2f470 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2f480 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2f490 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2f4a0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f4b0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2f4c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2f4d0 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2f4e0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2f4f0 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2f500 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f510 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2f520 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2f530 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2f540 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2f550 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2f560 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2f570 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2f580 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2f590 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2f5a0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2f5b0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2f5c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f5d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2f5e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2f5f0 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2f600 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f610 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2f620 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2f630 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2f640 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2f650 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f660 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2f670 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2f680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2f690 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2f6a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2f6b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2f6c0 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2f6d0 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2f6e0 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2f6f0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2f700 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2f710 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2f720 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2f730 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2f740 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2f750 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2f760 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2f770 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2f780 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f790 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2f7a0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2f7b0 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2f7c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f7d0 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2f7e0 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2f7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f800 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2f810 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2f820 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2f830 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2f840 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2f850 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2f860 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2f870 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2f880 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2f890 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2f8a0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2f8b0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2f8c0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2f8d0 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2f8e0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f8f0 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2f900 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2f910 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2f920 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2f930 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2f940 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2f950 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2f960 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2f970 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2f980 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2f990 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2f9a0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2f9b0 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2f9c0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2f9d0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2f9e0 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2f9f0 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2fa00 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2fa10 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2fa20 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2fa30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2fa40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2fa50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2fa60 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2fa70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fa80 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2fa90 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fab0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2fac0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2fad0 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
2fae0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2faf0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2fb00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fb20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2fb30 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61  abase is zero pa
2fb40 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61  ges in size, tha
2fb50 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
2fb60 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20 20  her (1) the.    
2fb70 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
2fb80 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d  s a remnant from
2fb90 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61 73   a prior databas
2fba0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2fbb0 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20  name where.     
2fbc0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2fbd0 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20  se file but not 
2fbe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
2fbf0 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20  deleted, or (2) 
2fc00 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20  the initial.    
2fc10 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
2fc20 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65  on that populate
2fc30 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  s a new database
2fc40 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
2fc50 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
2fc60 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
2fc70 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
2fc80 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  le can be delete
2fc90 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b  d.  However, tak
2fca0 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a  e care.        *
2fcb0 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20  * not to delete 
2fcc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fcd0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2fce0 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20  y open due to.  
2fcf0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2fd00 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20  _mode=PERSIST.. 
2fd10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fd20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
2fd30 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  & !jrnlOpen ){. 
2fd40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fd50 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2fd60 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
2fd70 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
2fd80 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2fd90 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
2fda0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fdb0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
2fdc0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2fdd0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
2fde0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2fdf0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2fe00 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
2fe10 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2fe20 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
2fe30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2fe40 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2fe50 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2fe60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fe70 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
2fe80 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2fe90 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2fea0 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
2feb0 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
2fec0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2fed0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2fee0 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
2fef0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
2ff00 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
2ff10 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
2ff20 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
2ff30 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2ff40 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2ff50 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2ff60 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
2ff70 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
2ff80 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
2ff90 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
2ffa0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
2ffb0 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
2ffc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2ffd0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2ffe0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
2fff0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
30000 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
30010 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
30020 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30030 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
30040 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30050 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
30060 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
30070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30080 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
300a0 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
300b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
300c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
300d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
300e0 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
300f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
30100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30110 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
30120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30150 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30160 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
30170 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30180 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
30190 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
301a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
301b0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
301c0 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
301d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
301e0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
301f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30200 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
30210 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
30220 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
30230 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
30240 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
30250 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
30260 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
30270 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
30280 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
30290 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
302a0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
302b0 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
302c0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
302d0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
302e0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
302f0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
30300 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
30310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
30320 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
30330 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
30340 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
30350 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
30360 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
30370 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
30380 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
30390 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
303a0 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
303b0 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
303c0 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
303d0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
303e0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
303f0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
30400 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
30410 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
30420 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
30430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
30440 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30450 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
30460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30470 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
30480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
304a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
304b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
304c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
304d0 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
304e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
304f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
30500 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
30510 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
30520 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
30530 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30540 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30550 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30560 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30570 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30580 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30590 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
305a0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
305b0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
305c0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
305d0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
305e0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
305f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
30600 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
30610 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
30620 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
30630 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
30640 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
30650 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30660 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30670 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30680 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30690 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
306a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
306b0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
306c0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
306d0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
306e0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
306f0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
30700 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
30710 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
30720 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
30730 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30740 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30750 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30760 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30770 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30780 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30790 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
307a0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
307b0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
307c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
307d0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
307e0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
307f0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
30800 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
30810 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
30820 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
30830 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
30840 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
30850 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30860 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30870 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30880 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
30890 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
308a0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
308b0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
308c0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
308d0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
308e0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
308f0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
30900 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
30910 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
30920 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
30930 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
30940 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
30950 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30960 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30970 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30980 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30990 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
309a0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
309b0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
309c0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
309d0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
309e0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
309f0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
30a00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30a10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
30a30 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30a40 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30a50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30a70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30a80 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
30a90 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
30aa0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
30ab0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
30ac0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
30ad0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
30ae0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
30af0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
30b00 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
30b10 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
30b20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
30b30 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30b40 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
30b50 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
30b60 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
30b70 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
30b80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
30b90 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
30ba0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
30bb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
30bc0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
30bd0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
30be0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30bf0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30c00 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
30c10 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
30c20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
30c30 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
30c40 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
30c50 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
30c60 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
30c70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
30c80 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
30c90 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30ca0 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
30cb0 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
30cc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30cd0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
30ce0 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
30cf0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
30d00 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
30d10 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
30d20 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
30d30 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
30d60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
30d70 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
30d80 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
30d90 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
30da0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30db0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30dc0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
30dd0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
30de0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
30df0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
30e00 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
30e10 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
30e20 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
30e30 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
30e40 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
30e50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
30e60 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
30e70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
30e80 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
30e90 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
30ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30ec0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
30ed0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
30ee0 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
30ef0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
30f00 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
30f10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30f20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
30f30 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
30f40 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30f50 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
30f60 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
30f70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30f80 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
30f90 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
30fa0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
30fb0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
30fc0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
30fd0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
30fe0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
30ff0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
31000 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
31010 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
31020 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
31030 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
31040 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
31050 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
31060 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
31070 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31080 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
31090 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
310a0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
310b0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
310c0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
310d0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
310e0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
310f0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
31100 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
31110 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
31120 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
31130 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
31140 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
31150 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31160 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31170 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31180 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
31190 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
311a0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
311b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
311c0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
311d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
311e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
311f0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
31200 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
31210 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
31220 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
31230 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
31240 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
31250 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31260 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31270 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31280 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31290 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
312a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
312b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
312c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
312d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
312e0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
312f0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
31300 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
31310 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
31320 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
31330 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31340 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
31350 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
31360 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
31370 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
31380 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
31390 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
313a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
313b0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
313c0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
313d0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
313e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
313f0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
31400 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
31410 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
31420 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
31430 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
31440 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
31450 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31460 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31470 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31480 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
31490 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
314a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
314b0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
314c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
314d0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
314e0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
314f0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
31500 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
31510 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
31520 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
31530 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
31540 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
31550 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31560 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31570 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31580 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
31590 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
315a0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
315b0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
315c0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
315d0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
315e0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
315f0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
31600 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
31610 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31620 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31630 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31640 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31650 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31660 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31670 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31680 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
31690 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
316a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
316b0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
316c0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
316d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
316e0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
316f0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
31700 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31710 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
31720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
31730 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
31740 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
31750 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
31760 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
31770 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
31780 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31790 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
317a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
317b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
317c0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
317d0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
317e0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
317f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
31800 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
31810 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
31820 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
31830 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31840 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
31850 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
31860 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
31870 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31880 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
31890 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
318a0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
318b0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
318c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
318d0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
318e0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
318f0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
31900 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
31910 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
31920 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
31930 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
31940 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
31950 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
31960 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
31970 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
31980 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
31990 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
319a0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
319b0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
319c0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
319d0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
319e0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
319f0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
31a00 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
31a10 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
31a20 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
31a30 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
31a40 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
31a50 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
31a60 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
31a70 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
31a80 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31a90 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
31aa0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31ab0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
31ac0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
31ad0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
31ae0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
31af0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
31b00 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
31b10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
31b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31b30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31b40 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
31b50 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
31b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
31b70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
31b80 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
31b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
31ba0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31bb0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
31bc0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
31bd0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
31be0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
31c10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
31c20 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
31c30 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
31c40 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
31c50 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
31c60 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
31c70 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
31c80 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
31c90 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
31ca0 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
31cb0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
31cc0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
31cd0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
31ce0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
31cf0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
31d00 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
31d10 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
31d20 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
31d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
31d40 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
31d50 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
31d60 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
31d70 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
31d80 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
31d90 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
31da0 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
31db0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31dc0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
31dd0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
31de0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
31df0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
31e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
31e10 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
31e20 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
31e30 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
31e40 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
31e50 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
31e60 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
31e70 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
31e80 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
31e90 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
31ea0 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
31eb0 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
31ec0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31ed0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
31ee0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
31ef0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
31f00 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
31f10 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
31f20 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
31f30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31f40 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
31f50 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
31f60 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
31f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
31f80 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
31f90 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
31fa0 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
31fb0 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
31fc0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
31fd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31fe0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
31ff0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
32000 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32010 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
32020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32030 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32040 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32050 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
32060 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
32070 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
32080 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32090 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
320a0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
320b0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
320c0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
320d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28  r->tempFile && (
320e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
320f0 3e 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c  >pBackup .     |
32100 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
32110 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
32120 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20  >pPCache)>0 .   
32130 20 20 7c 7c 20 55 53 45 46 45 54 43 48 28 70 50    || USEFETCH(pP
32140 61 67 65 72 29 0a 20 20 20 20 29 29 7b 0a 20 20  ager).    )){.  
32150 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
32160 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
32170 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
32180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32190 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
321a0 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
321b0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
321c0 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
321d0 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
321e0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
321f0 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
32200 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
32210 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
32220 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
32230 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
32240 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
32250 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
32260 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
32270 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
32280 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
32290 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
322a0 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
322b0 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
322c0 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
322d0 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
322e0 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
322f0 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
32300 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
32310 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
32320 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
32330 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
32340 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
32350 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
32360 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
32370 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
32380 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
32390 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
323a0 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
323b0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
323c0 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
323d0 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
323e0 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
323f0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
32400 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
32410 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
32420 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
32430 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
32440 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
32450 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
32460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e      */.      Pgn
32470 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  o nPage = 0;.   
32480 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
32490 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
324a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
324b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
324c0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
324d0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
324e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
324f0 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69  failed;..      i
32500 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
32510 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
32520 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
32530 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
32540 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
32550 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32560 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
32570 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
32580 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
32590 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
325a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
325b0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
325c0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
325d0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
325e0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
325f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
32610 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
32620 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
32630 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
32640 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
32650 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
32660 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
32670 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
32680 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
32690 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
326a0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  (pPager);..     
326b0 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20     /* Unmap the 
326c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
326d0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
326e0 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63  at external proc
326f0 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  esses.        **
32700 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61   may have trunca
32710 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ted the database
32720 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65   file and then e
32730 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a  xtended it back.
32740 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74          ** to it
32750 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
32760 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
32770 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69  ss was not holdi
32780 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  ng a lock..     
32790 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
327a0 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69  se there may exi
327b0 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20  st a Pager.pMap 
327c0 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70  mapping that app
327d0 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ears.        ** 
327e0 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20  to be the right 
327f0 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20  size but is not 
32800 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20  actually valid. 
32810 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20  Avoid this.     
32820 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74     ** possibilit
32830 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74  y by unmapping t
32840 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20  he db here. */. 
32850 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45         if( USEFE
32860 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20  TCH(pPager) ){. 
32870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32880 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
32890 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
328a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
328b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
328c0 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
328d0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
328e0 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
328f0 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
32900 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
32910 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
32920 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
32930 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
32940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
32950 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
32960 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
32970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32980 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
32990 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
329a0 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
329b0 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
329c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
329d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
329e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
329f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
32a00 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
32a10 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
32a20 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
32a30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
32a40 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32a50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
32a60 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
32a70 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32a80 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
32a90 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
32aa0 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
32ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32ac0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
32ad0 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
32ae0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
32af0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32b00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32b10 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
32b20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32b30 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
32b40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
32b50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
32b60 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
32b70 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
32b80 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
32b90 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
32ba0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
32bb0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
32bc0 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
32bd0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
32be0 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
32bf0 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
32c00 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
32c10 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
32c20 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
32c30 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
32c40 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
32c50 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
32c60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
32c70 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
32c80 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
32c90 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
32ca0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
32cb0 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f  ( pPager->nMmapO
32cc0 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65  ut==0 && (sqlite
32cd0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
32ce0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
32cf0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ==0) ){.    page
32d00 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
32d10 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
32d20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
32d30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
32d40 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
32d50 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
32d60 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
32d70 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
32d80 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
32d90 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
32da0 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
32db0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
32dc0 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
32dd0 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
32de0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
32df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
32e00 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
32e10 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
32e20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
32e30 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
32e40 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
32e50 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
32e60 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
32e70 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
32e80 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
32e90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
32ea0 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
32eb0 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
32ec0 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
32ed0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
32ee0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
32ef0 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
32f00 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
32f10 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
32f20 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
32f30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
32f40 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
32f50 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
32f60 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
32f70 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
32f80 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
32f90 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
32fa0 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
32fb0 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
32fc0 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
32fd0 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
32fe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32ff0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
33000 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
33010 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
33020 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
33030 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
33040 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
33050 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
33060 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
33070 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
33080 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
33090 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
330a0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
330b0 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
330c0 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
330d0 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
330e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
330f0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
33100 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
33110 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
33120 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
33130 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
33140 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
33150 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
33160 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
33170 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
33180 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
33190 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
331a0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
331b0 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
331c0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
331d0 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
331e0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
331f0 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
33200 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
33210 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
33220 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
33230 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
33240 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
33250 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
33260 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
33270 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
33280 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
33290 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
332a0 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
332b0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
332c0 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
332d0 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
332e0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
332f0 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
33300 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
33310 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
33320 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
33330 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
33340 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
33350 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
33360 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
33370 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
33380 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
33390 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
333a0 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
333b0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
333c0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
333d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
333e0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
333f0 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
33400 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
33410 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
33420 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
33430 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
33440 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
33450 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
33460 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
33470 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
33480 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
33490 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
334a0 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
334b0 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
334c0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
334d0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
334e0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
334f0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
33500 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
33510 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
33520 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
33530 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
33540 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
33550 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
33560 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
33570 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
33580 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
33590 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
335a0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
335b0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
335c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
335d0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
335e0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
335f0 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
33600 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
33610 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
33620 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
33630 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
33640 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
33650 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
33660 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
33670 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
33680 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
33690 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
336a0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
336b0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
336c0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
336d0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
336e0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
336f0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
33700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
33710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33720 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
33730 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
33740 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
33750 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
33760 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
33770 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
33780 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
33790 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
337a0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
337b0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
337c0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
337d0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
337e0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
337f0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
33800 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
33810 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33820 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
33830 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
33840 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33850 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
33860 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
33870 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  file */.  const 
33880 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20  int noContent = 
33890 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
338a0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a  ET_NOCONTENT);..
338b0 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70    /* It is accep
338c0 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72  table to use a r
338d0 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20  ead-only (mmap) 
338e0 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67  page for any pag
338f0 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61  e except.  ** pa
33900 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73  ge 1 if there is
33910 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
33920 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68  ction open or th
33930 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e  e ACQUIRE_READON
33940 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73  LY.  ** flag was
33950 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
33960 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f  e caller. And so
33970 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20   long as the db 
33980 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74  is not a .  ** t
33990 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
339a0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
339b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
339c0 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21  bMmapOk = (pgno!
339d0 3d 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70  =1 && USEFETCH(p
339e0 50 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50  Pager).   && (pP
339f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33a00 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
33a10 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
33a20 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64  _READONLY)).#ifd
33a30 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
33a40 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72  DEC.   && pPager
33a50 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64  ->xCodec==0.#end
33a60 69 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  if.  );..  asser
33a70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33a80 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
33a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
33aa0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33ab0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
33ac0 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  ert( noContent==
33ad0 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  0 || bMmapOk==0 
33ae0 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
33af0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
33b00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33b10 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
33b20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
33b30 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
33b40 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
33b50 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
33b60 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
33b70 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
33b80 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
33b90 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
33ba0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
33bb0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e!=SQLITE_OK ){.
33bc0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
33bd0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
33be0 65 7b 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61  e{..    if( bMma
33bf0 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57  pOk && pagerUseW
33c00 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
33c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33c20 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
33c30 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
33c40 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
33c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33c60 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
33c70 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
33c80 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61   }..    if( bMma
33c90 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30  pOk && iFrame==0
33ca0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
33cb0 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20  pData = 0;..    
33cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
33cd0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
33ce0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 36  , .          (i6
33cf0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
33d00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
33d10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
33d20 20 26 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b   &pData.      );
33d30 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
33d40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
33d50 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ta ){.        if
33d60 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33d70 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b  >PAGER_READER ){
33d80 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
33d90 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
33da0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
33db0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
33dc0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Pg);.        }. 
33dd0 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
33de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
33df0 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
33e00 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20  MapPage(pPager, 
33e10 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50  pgno, pData, &pP
33e20 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  g);.        }els
33e30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
33e40 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
33e50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
33e60 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
33e70 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
33e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33e90 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
33ea0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
33eb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50  ;.          *ppP
33ed0 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  age = pPg;.     
33ee0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33ef0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
33f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33f20 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
33f30 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33f40 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
33f50 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
33f60 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
33f70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
33f80 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
33f90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
33fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33fb0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
33fc0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
33fd0 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
33fe0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
33ff0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
34000 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
34010 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
34020 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34030 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
34040 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
34050 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
34060 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
34070 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
34080 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
34090 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
340a0 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
340b0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
340c0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
340d0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
340e0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
340f0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
34100 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
34110 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
34120 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
34130 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
34140 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
34150 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
34160 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
34170 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
34180 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
34190 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
341a0 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
341b0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
341c0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
341d0 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
341e0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
341f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
34200 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  t[PAGER_STAT_HIT
34210 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]++;.    return 
34220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
34230 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
34240 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
34250 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
34260 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
34270 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
34280 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
34290 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20    */..    pPg = 
342a0 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
342b0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
342c0 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
342d0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
342e0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
342f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34300 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
34310 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
34320 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
34330 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
34340 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
34350 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
34360 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
34370 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
34380 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34390 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
343a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
343b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
343c0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
343d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
343e0 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50   if( MEMDB || pP
343f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
34400 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c  o || noContent |
34410 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
34420 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
34430 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
34440 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
34450 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
34460 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
34470 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34480 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34490 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
344a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
344b0 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
344c0 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
344d0 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
344e0 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
344f0 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
34500 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
34510 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
34520 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
34530 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
34540 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
34550 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
34560 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
34570 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
34580 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
34590 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
345a0 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
345b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
345c0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
345d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
345e0 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
345f0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
34600 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
34610 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
34620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
34630 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
34640 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
34650 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
34660 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
34670 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
34680 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
34690 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
346a0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
346b0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
346c0 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
346d0 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
346e0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
346f0 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
34700 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
34710 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
34720 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
34730 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
34740 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
34750 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
34760 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
34770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
34780 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34790 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
347a0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
347b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
347c0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
347d0 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70  pPager) && bMmap
347e0 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Ok==0 ){.       
347f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
34800 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
34810 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
34820 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  Frame);.        
34830 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34840 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
34850 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34860 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
34870 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
34880 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70  Pager );.      p
34890 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
348a0 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b  ER_STAT_MISS]++;
348b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
348c0 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
348d0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
348e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
348f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34900 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34910 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34920 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
34930 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  hash(pPg);.  }..
34940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34950 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
34960 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
34970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34980 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
34990 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
349a0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
349b0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
349c0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
349d0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
349e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
349f0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
34a00 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
34a10 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
34a20 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
34a30 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
34a40 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
34a50 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
34a60 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
34a70 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
34a80 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
34a90 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  che. .**.** See 
34aa0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
34ab0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
34ac0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
34ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
34ae0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
34af0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
34b00 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
34b10 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
34b20 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
34b30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
34b40 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
34b50 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
34b60 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
34b70 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
34b80 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
34b90 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
34ba0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
34bb0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
34bc0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
34bd0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
34be0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
34bf0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
34c00 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
34c10 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
34c20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
34c30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34c40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
34c50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34c60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
34c70 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
34c80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
34c90 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
34ca0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34cb0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
34cc0 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
34cd0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
34ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
34cf0 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
34d00 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
34d10 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
34d20 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
34d30 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
34d40 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
34d50 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
34d60 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
34d70 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
34d80 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
34d90 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
34da0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
34db0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
34dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
34dd0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
34de0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
34df0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62  rUnrefNotNull(Db
34e00 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
34e10 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61  ger *pPager;.  a
34e20 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
34e30 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
34e40 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
34e50 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
34e60 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61  R_MMAP ){.    pa
34e70 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
34e80 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
34e90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
34ea0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
34eb0 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
34ec0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
34ed0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
34ee0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
34ef0 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
34f00 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67  pPg ) sqlite3Pag
34f10 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
34f20 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
34f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
34f40 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
34f50 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
34f60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
34f70 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
34f80 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
34f90 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
34fa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
34fb0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
34fc0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
34fd0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
34fe0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
34ff0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
35000 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
35010 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
35020 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
35030 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
35040 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
35050 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
35060 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
35070 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
35080 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
35090 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
350a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
350b0 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
350c0 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
350d0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
350e0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
350f0 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
35100 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
35110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
35120 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
35130 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
35140 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
35150 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
35160 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
35170 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
35180 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35190 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
351a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
351b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
351c0 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
351d0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
351e0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
351f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35200 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
35210 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
35220 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
35230 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
35240 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
35250 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
35260 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
35270 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
35280 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
35290 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
352a0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
352b0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
352c0 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
352d0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
352e0 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
352f0 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
35300 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
35310 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
35320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35330 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
35340 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
35350 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35360 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35380 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35390 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
353a0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
353b0 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
353c0 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
353d0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
353e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
353f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35400 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
35410 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
35420 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35430 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
35440 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
35450 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
35460 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
35470 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
35480 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
35490 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
354a0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
354b0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
354c0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
354d0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
354e0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
354f0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
35500 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
35510 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
35520 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
35530 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
35540 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
35550 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
35560 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
35570 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35580 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
35590 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
355a0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
355b0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
355c0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
355d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
355e0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
355f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
35600 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  M;.    }.  .    
35610 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
35620 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
35630 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
35640 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
35650 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
35660 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
35670 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35680 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
35690 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
356a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
356b0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
356c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
356d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
356e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
356f0 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
35700 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
35710 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
35720 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
35730 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
35740 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
35750 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
35760 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
35770 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
35780 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
35790 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
357a0 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
357b0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
357c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
357d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
357e0 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
357f0 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    );..        /*
35800 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
35810 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
35820 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
35830 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
35840 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
35850 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
35860 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
35870 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
35880 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
35890 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
358a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
358b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
358c0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
358d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
358e0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
358f0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
35900 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
35910 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
35920 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
35930 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
35940 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  er).          );
35950 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
35960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
35970 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
35980 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35990 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
359a0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
359b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
359c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
359d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
359e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
359f0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
35a00 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
35a10 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
35a20 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
35a30 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
35a40 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
35a50 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
35a60 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
35a70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
35a90 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
35aa0 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
35ab0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
35ac0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
35ad0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
35ae0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
35af0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
35b00 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
35b10 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
35b20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
35b30 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
35b40 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
35b50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
35b60 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
35b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b80 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
35b90 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
35ba0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
35bb0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35bc0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
35bd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35be0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35bf0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
35c00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
35c10 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
35c20 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
35c30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
35c40 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
35c50 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
35c60 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
35c70 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
35c80 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
35c90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
35ca0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
35cb0 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
35cc0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
35cd0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
35ce0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
35cf0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
35d00 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
35d10 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
35d20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35d30 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
35d40 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
35d50 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
35d60 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
35d70 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
35d80 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
35d90 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
35da0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
35db0 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
35dc0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
35dd0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
35de0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
35df0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
35e00 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
35e10 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
35e20 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
35e30 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
35e40 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
35e50 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
35e60 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
35e70 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
35e80 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
35e90 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
35ea0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
35eb0 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
35ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
35ed0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
35ee0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
35ef0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
35f00 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
35f10 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
35f20 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
35f30 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
35f40 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
35f50 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
35f60 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
35f70 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
35f80 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
35f90 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
35fa0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
35fb0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
35fc0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
35fd0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
35fe0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35ff0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
36000 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
36010 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36020 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
36030 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36040 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
36050 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
36060 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
36070 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
36080 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
36090 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
360a0 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
360b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
360c0 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
360d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
360e0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
360f0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
36100 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
36110 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36120 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
36130 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
36140 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
36150 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
36160 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
36170 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36180 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
36190 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
361a0 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
361b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
361c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
361d0 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
361e0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
361f0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
36200 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
36210 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
36220 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36250 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36260 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
36270 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
36280 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36290 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
362a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
362b0 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
362c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
362d0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
362e0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
362f0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
36300 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
36310 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
36320 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
36330 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
36340 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
36350 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
36360 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
36370 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
36380 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
36390 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
363a0 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
363b0 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
363c0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
363d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
363e0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
363f0 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
36400 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
36410 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
36420 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
36430 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
36440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36450 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
36460 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
36470 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
36480 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
36490 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
364a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
364b0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
364c0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
364d0 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
364e0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
364f0 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
36500 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
36510 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
36520 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
36530 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
36540 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
36550 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
36560 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
36570 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
36580 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
36590 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
365a0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
365b0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
365c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
365d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
365e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
365f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
36600 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
36610 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
36620 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36630 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
36640 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
36650 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36660 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
36670 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
36680 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
36690 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
366a0 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
366b0 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
366c0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
366d0 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
366e0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
366f0 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
36700 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
36710 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
36720 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
36730 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
36740 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
36750 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
36760 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
36770 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
36780 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
36790 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
367a0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
367b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
367c0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
367d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
367e0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
367f0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
36800 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36810 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
36820 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
36830 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36840 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
36850 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36860 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
36880 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
36890 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
368a0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
368b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
368c0 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
368d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
368e0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
368f0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36900 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
36910 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36920 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36930 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
36940 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
36950 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
36960 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
36970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36980 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
36990 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
369a0 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
369b0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
369c0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
369d0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
369e0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
369f0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
36a00 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
36a10 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
36a20 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
36a30 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
36a40 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
36a50 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
36a60 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
36a70 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
36a80 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
36a90 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
36aa0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
36ab0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
36ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
36ad0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
36ae0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36af0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
36b00 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
36b10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
36b20 69 6e 4a 6f 75 72 6e 61 6c 3b 0a 0a 20 20 2f 2a  inJournal;..  /*
36b30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
36b40 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
36b50 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
36b60 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
36b70 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
36b80 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
36b90 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
36ba0 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
36bb0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
36bc0 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
36bd0 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
36be0 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
36bf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36c00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36c10 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
36c20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
36c30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36c40 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
36c50 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
36c60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36c70 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
36c80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36c90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36ca0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
36cb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36cc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
36cd0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
36ce0 79 3d 3d 30 20 29 3b 0a 0a 20 20 43 48 45 43 4b  y==0 );..  CHECK
36cf0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
36d00 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
36d10 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f  le needs to be o
36d20 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65  pened. Higher le
36d30 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76  vel routines hav
36d40 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f  e already.  ** o
36d50 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65  btained the nece
36d60 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62  ssary locks to b
36d70 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74  egin the write-t
36d80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
36d90 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  the.  ** rollbac
36da0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  k journal might 
36db0 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e  not yet be open.
36dc0 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20   Open it now if 
36dd0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
36de0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
36df0 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
36e00 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
36e10 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
36e20 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20   on the page. . 
36e30 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
36e40 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61  f it were done a
36e50 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fter calling sql
36e60 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
36e70 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a  rty(), then.  **
36e80 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20   an error might 
36e90 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61  occur and the pa
36ea0 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70  ger would end up
36eb0 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   in WRITER_LOCKE
36ec0 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74  D state.  ** wit
36ed0 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61  h pages marked a
36ee0 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20 63  s dirty in the c
36ef0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
36f00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36f10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
36f20 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  CKED ){.    rc =
36f30 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
36f40 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
36f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36f60 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
36f70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
36f80 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
36f90 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
36fa0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
36fb0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
36fc0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
36fd0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
36fe0 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
36ff0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
37000 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
37010 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
37020 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
37030 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
37040 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
37050 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
37060 72 74 79 28 70 50 67 29 3b 0a 20 20 69 6e 4a 6f  rty(pPg);.  inJo
37070 75 72 6e 61 6c 20 3d 20 70 61 67 65 49 6e 4a 6f  urnal = pageInJo
37080 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50  urnal(pPager, pP
37090 67 29 3b 0a 20 20 69 66 28 20 69 6e 4a 6f 75 72  g);.  if( inJour
370a0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
370b0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c  nSavepoint==0 ||
370c0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
370d0 67 65 28 70 50 67 29 29 20 29 7b 0a 20 20 20 20  ge(pPg)) ){.    
370e0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
370f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
37100 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
37110 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
37120 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
37130 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
37140 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
37150 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
37160 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37170 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
37180 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
37190 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
371a0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
371b0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
371c0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
371d0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
371e0 0a 20 20 20 20 69 66 28 20 21 69 6e 4a 6f 75 72  .    if( !inJour
371f0 6e 61 6c 20 26 26 20 21 70 61 67 65 72 55 73 65  nal && !pagerUse
37200 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
37210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67       assert( pag
37220 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
37230 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
37240 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
37250 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26  er->dbOrigSize &
37260 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
37270 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
37280 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
37290 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
372a0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  ;.        i64 iO
372b0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
372c0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20  rnalOff;..      
372d0 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
372e0 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
372f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
37300 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
37310 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
37320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
37330 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
37340 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
37350 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
37360 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
37370 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
37380 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
37390 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
373a0 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  r) );..        a
373b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
373c0 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65  ournalHdr<=pPage
373d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
373e0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
373f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
37400 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
37410 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
37420 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
37430 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
37440 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
37450 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
37460 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
37470 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
37480 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
37490 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
374a0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
374b0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
374c0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
374d0 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
374e0 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
374f0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
37500 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
37510 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
37520 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
37530 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
37540 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
37550 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
37560 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
37570 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
37580 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
37590 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
375a0 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
375b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
375c0 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
375d0 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
375e0 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
375f0 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
37600 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
37610 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
37620 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
37630 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
37640 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
37650 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
37660 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
37670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37680 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
37690 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
376a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
376b0 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
376c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
376d0 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20  iOff+4);.       
376e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
376f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37700 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
37710 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37720 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65  >jfd, iOff+pPage
37730 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63  r->pageSize+4, c
37740 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  ksum);.        i
37750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37760 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
37770 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
37780 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
37790 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
377a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
377b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
377c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
377d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
377e0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
377f0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
37800 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
37810 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
37820 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
37830 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
37840 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
37850 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
37860 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
37870 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
37880 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
37890 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
378a0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
378b0 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
378c0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
378d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
378e0 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61  alOff += 8 + pPa
378f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
37900 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
37910 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
37920 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
37930 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
37940 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37950 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
37960 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37970 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
37990 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
379a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
379b0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
379c0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
379d0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
379e0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
379f0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
37a00 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
37a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37a40 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37a50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
37a60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
37a70 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
37a80 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37a90 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
37aa0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
37ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
37ac0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37ad0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
37ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
37af0 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
37b00 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
37b10 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
37b20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37b30 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37b40 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
37b50 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
37b60 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37b70 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
37b80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
37b90 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
37ba0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
37bb0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
37bc0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
37bd0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
37be0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
37bf0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
37c00 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
37c10 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
37c20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37c30 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
37c40 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
37c50 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
37c60 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
37c70 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
37c80 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
37c90 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
37ca0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
37cb0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
37cc0 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
37cd0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
37ce0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
37cf0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
37d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
37d10 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
37d20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
37d30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37d40 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
37d50 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
37d60 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
37d70 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
37d80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37d90 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
37da0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
37db0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
37dc0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
37dd0 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
37de0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
37df0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
37e00 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
37e10 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
37e20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
37e30 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
37e40 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
37e50 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
37e60 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
37e70 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
37e80 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
37e90 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
37ea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
37eb0 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
37ec0 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
37ed0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
37ee0 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
37ef0 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
37f00 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
37f10 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
37f20 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
37f30 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
37f40 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
37f50 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
37f60 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
37f70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37f80 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
37f90 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
37fa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
37fb0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
37fc0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
37fd0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
37fe0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
37ff0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
38000 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
38010 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
38020 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
38030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
38040 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
38050 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
38060 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
38070 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
38080 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
38090 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
380a0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
380b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
380c0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
380d0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
380e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
380f0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
38100 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
38110 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
38120 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
38130 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
38140 69 7a 65 20 3e 20 28 75 33 32 29 70 50 61 67 65  ize > (u32)pPage
38150 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
38160 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
38170 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
38180 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
38190 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
381a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
381b0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
381c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
381d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
381e0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
381f0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
38200 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  t nPage = 0;    
38210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38220 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
38230 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
38240 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
38250 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
38260 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
38270 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
38280 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
38290 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
382a0 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
382b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
382c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  */.    Pgno nPag
382d0 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
382e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
382f0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
38300 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  e);..    /* Set 
38310 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  the doNotSpill N
38320 4f 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20  OSYNC bit to 1. 
38330 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
38340 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
38350 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c      ** a journal
38360 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
38370 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
38380 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
38390 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73  d by.    ** this
383a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
383b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
383c0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
383d0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
383e0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
383f0 4c 41 47 5f 4e 4f 53 59 4e 43 29 3d 3d 30 20 29  LAG_NOSYNC)==0 )
38400 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
38410 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
38420 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20  LFLAG_NOSYNC;.. 
38430 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
38440 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
38450 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
38460 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
38470 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
38480 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
38490 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
384a0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
384b0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
384c0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
384d0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
384e0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
384f0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
38500 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
38510 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
38520 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
38530 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
38540 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
38550 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
38560 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
38570 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
38580 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
38590 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
385a0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
385b0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
385c0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
385d0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
385e0 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
385f0 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
38600 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
38610 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
38620 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
38630 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
38640 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
38650 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
38660 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
38670 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
38680 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
38690 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
386a0 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
386b0 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
386c0 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if