/ Hex Artifact Content
Login

Artifact 9d29fb3dfd99d16896d839a511b467784d72f4da:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 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 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78f0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
7900: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7910: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7920: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7930: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7940: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7950: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7960: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 69 73 20   read from this 
7970: 70 61 67 65 72 2a 2f 0a 20 20 50 67 6e 6f 20 64  pager*/.  Pgno d
7980: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
79a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
79b0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
79c0: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
79d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
79e0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
79f0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7a00: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7a10: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7a30: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7a40: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7a50: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
7a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7a70: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
7a80: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7a90: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7aa0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7ab0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7ac0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7ad0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7ae0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7b00: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7b10: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7b20: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7b30: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7b50: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7b60: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7b70: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7b80: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7ba0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7bb0: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7bc0: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7bd0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7be0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7bf0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7c00: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7c10: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7c20: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7c30: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7c40: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7c50: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7c60: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7c70: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7c80: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7c90: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7ca0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7cb0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7cc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7cd0: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7ce0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7cf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7d00: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7d10: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7d20: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7d30: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7d50: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7d60: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7d70: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7d80: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7d90: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7da0: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7db0: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7dc0: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7dd0: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
7de0: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
7df0: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
7e00: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
7e10: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
7e20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7e30: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
7e40: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
7e50: 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f   u32 iDataVersio
7e60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
7e70: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
7e80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
7e90: 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63  t changes */.  c
7ea0: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
7eb0: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
7ec0: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
7ed0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
7ee0: 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  nges */..  int n
7ef0: 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20  MmapOut;        
7f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7f10: 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63   of mmap pages c
7f20: 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e  urrently outstan
7f30: 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ding */.  sqlite
7f40: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20  3_int64 szMmap; 
7f50: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
7f60: 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69   maximum mmap si
7f70: 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ze */.  PgHdr *p
7f80: 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20  MmapFreelist;   
7f90: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
7fa0: 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65  ree mmap page he
7fb0: 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a  aders (pDirty) *
7fc0: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7fd0: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7fe0: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7ff0: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
8050: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
8060: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
8070: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
8080: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
8090: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
80a0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
80b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
80c0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
80d0: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
80e0: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
80f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
8100: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
8110: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8120: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
8130: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8140: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
8150: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
8160: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
8170: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8190: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
81a0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
81b0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
81d0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
81e0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
81f0: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
8200: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
8210: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
8220: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
8230: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
8240: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
8250: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
8260: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8270: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
8280: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
8290: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
82a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
82b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
82c0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
82d0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
82e0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
82f0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
8300: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
8310: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
8320: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
8330: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
8340: 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33  */.  int aStat[3
8350: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
8360: 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20   /* Total cache 
8370: 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64  hits, misses and
8380: 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65   writes */.#ifde
8390: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
83a0: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
83c0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
83d0: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  ad */.#endif.  v
83e0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
83f0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
8400: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
8410: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
8420: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
8430: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
8440: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
8450: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
8460: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
8470: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
8480: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
8490: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
84a0: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
84b0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
84c0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
84d0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
84e0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
84f0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
8500: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
8510: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
8520: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8540: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8550: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
8560: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
8570: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
8580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8590: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
85a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
85b0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43   tmp use */.  PC
85c0: 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20  ache *pPCache;  
85d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
85e0: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63  nter to page cac
85f0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66  he object */.#if
8600: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8610: 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c  _WAL.  Wal *pWal
8620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8630: 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61     /* Write-ahea
8640: 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a  d log used by "j
8650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
8660: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c   */.  char *zWal
8670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8680: 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66    /* File name f
8690: 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  or write-ahead l
86a0: 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  og */.#endif.};.
86b0: 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66  ./*.** Indexes f
86c0: 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65  or use with Page
86d0: 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50  r.aStat[]. The P
86e0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72  ager.aStat[] arr
86f0: 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ay contains.** t
8700: 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  he values access
8710: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51  ed by passing SQ
8720: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
8730: 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d  CHE_HIT, CACHE_M
8740: 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45  ISS .** or CACHE
8750: 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65  _WRITE to sqlite
8760: 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a  3_db_status()..*
8770: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
8780: 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65  STAT_HIT   0.#de
8790: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
87a0: 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20  MISS  1.#define 
87b0: 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
87c0: 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   2../*.** The fo
87d0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
87e0: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
87f0: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
8800: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
8810: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
8820: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
8830: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
8840: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
8850: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
8860: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
8870: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
8880: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
8890: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
88a0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
88b0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
88c0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
88d0: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
88e0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88f0: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
8900: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
8910: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
8920: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
8930: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8940: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
8950: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8960: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
8970: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
8980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8990: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
89a0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
89b0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
89c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
89d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
89e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
89f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
8a00: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
8a10: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
8a20: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
8a30: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
8a40: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
8a50: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
8a60: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
8a70: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
8a80: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
8a90: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
8aa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8ab0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
8ac0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8ad0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
8ae0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
8af0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
8b00: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
8b10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8b20: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
8b30: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
8b40: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
8b50: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
8b60: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
8b70: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
8b80: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
8b90: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
8ba0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
8bb0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
8bc0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8bd0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
8be0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
8bf0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
8c00: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
8c10: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8c20: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
8c30: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
8c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
8c50: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
8c60: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
8c70: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
8c80: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
8c90: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
8ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
8cb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
8cc0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
8cd0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
8ce0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
8cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
8d00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
8d10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
8d20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
8d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
8d40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
8d50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
8d60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
8d70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
8d80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
8d90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
8da0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
8db0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
8dc0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
8dd0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
8de0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
8df0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
8e00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
8e10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
8e20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
8e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
8e40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
8e50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
8e60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
8e70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
8e80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
8e90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
8ea0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
8eb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
8ec0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
8ed0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
8ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8ef0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
8f00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
8f10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
8f20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
8f30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
8f40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8f50: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
8f60: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
8f70: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
8f80: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8f90: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
8fa0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
8fb0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
8fc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
8fd0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
8fe0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
8ff0: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
9000: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
9010: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
9020: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
9030: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
9040: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
9050: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
9060: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
9070: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
9080: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
9090: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
90a0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
90b0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
90c0: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
90d0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
90e0: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
90f0: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
9100: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
9110: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
9120: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
9130: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
9140: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
9150: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
9160: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
9170: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
9180: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
9190: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
91a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
91b0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
91c0: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
91d0: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
91e0: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
91f0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55  *.** The macro U
9200: 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20  SEFETCH is true 
9210: 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65  if we are allowe
9220: 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65  d to use the xFe
9230: 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68  tch and xUnfetch
9240: 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74  .** interfaces t
9250: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9260: 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f  abase using memo
9270: 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a  ry-mapped I/O..*
9280: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
9290: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64  _MMAP_SIZE>0.# d
92a0: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
92b0: 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63  ) ((x)->bUseFetc
92c0: 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  h).#else.# defin
92d0: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a  e USEFETCH(x) 0.
92e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
92f0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
9300: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
9310: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
9320: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
9330: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
9340: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
9350: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
9360: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
9370: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
9380: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
9390: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
93a0: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
93b0: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
93c0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
93d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
93e0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
93f0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
9400: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
9410: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
9420: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
9430: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
9440: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
9450: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
9460: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
9470: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
9480: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
9490: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
94a0: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
94b0: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
94c0: 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20   log instead of 
94d0: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c  the usual.** rol
94e0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f  lback journal. O
94f0: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
9500: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9510: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69  E_OMIT_WAL.stati
9520: 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61  c int pagerUseWa
9530: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
9540: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  {.  return (pPag
9550: 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a  er->pWal!=0);.}.
9560: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
9570: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
9580: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
9590: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
95a0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
95b0: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20  Frames(v,w,x,y) 
95c0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95d0: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
95e0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
95f0: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9600: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
9610: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
9620: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
9630: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
9640: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
9650: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
9660: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9670: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9680: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9690: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
96a0: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
96b0: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
96c0: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
96d0: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
96e0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
96f0: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9700: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
9710: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
9720: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
9730: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
9740: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9750: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
9760: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9770: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9780: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9790: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97a0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
97b0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
97c0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
97d0: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
97e0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
97f0: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9800: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9810: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9820: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
9830: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9840: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
9850: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
9860: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9870: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9880: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9890: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
98a0: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
98b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
98c0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
98d0: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
98e0: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
98f0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9900: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
9910: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9920: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
9930: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
9940: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9950: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
9960: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9970: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9980: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9990: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
99a0: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
99b0: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
99c0: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
99e0: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
99f0: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9a00: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
9a10: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
9a20: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
9a30: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
9a40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9a50: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9a60: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9a70: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9a80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9a90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9aa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9ab0: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9ac0: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9ad0: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9ae0: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9af0: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9b00: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
9b10: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
9b20: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9b30: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
9b40: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
9b50: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
9b60: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9b70: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9b80: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9b90: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9ba0: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9bb0: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9bc0: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9bd0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9be0: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9bf0: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9c00: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
9c10: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
9c20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
9c30: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
9c40: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
9c50: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
9c60: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9c70: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9c80: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9c90: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9ca0: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9cb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9cc0: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9cd0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9ce0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9cf0: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9d00: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9d10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d20: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
9d30: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
9d40: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
9d50: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
9d60: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9d70: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9d80: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9d90: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9da0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9db0: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9dc0: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9dd0: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9de0: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9df0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9e00: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
9e10: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
9e20: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
9e30: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
9e40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9e50: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
9e60: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9e70: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9e80: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9e90: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9ea0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9eb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ec0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9ed0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9ef0: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9f00: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
9f10: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
9f20: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
9f30: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f40: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
9f50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9f60: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9f70: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9f80: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f90: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fb0: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9fc0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
9fd0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9fe0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
9ff0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a000: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a010: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a020: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a030: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a040: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a050: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a060: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a070: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a080: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a0a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a0b0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a0c0: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a0d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a0e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a0f0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a100: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a110: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a120: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a130: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a150: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a160: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a170: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a180: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a190: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a1a0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a1b0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a1c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a1d0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a1e0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a1f0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a200: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a210: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a220: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a230: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a240: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a250: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a260: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a270: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a280: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a290: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a2a0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a2b0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a2c0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a2d0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a2e0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a2f0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a300: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a310: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a320: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a330: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a340: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a350: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a360: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a370: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a380: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a390: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a3a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a3b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a3c0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a3e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a3f0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a400: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a410: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a420: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a430: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a440: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a450: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a460: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a480: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a490: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a4a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4b0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a4c0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a4d0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a4e0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a4f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a500: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a510: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a520: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a530: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a540: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a550: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a560: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a570: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a580: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a590: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a5a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a5b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a5c0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a5d0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a5e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a5f0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a600: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a610: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a620: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a630: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a640: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a650: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a660: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a670: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a680: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a690: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a6a0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a6b0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a6c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a6d0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a6e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a6f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a700: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a710: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a720: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a730: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a740: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a750: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a760: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a770: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a780: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a790: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a7a0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a7b0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a7c0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a7d0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a7e0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a7f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a800: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a810: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a820: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a830: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a840: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a850: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
a860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a870: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a880: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
a890: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
a8a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
a8b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a8c0: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
a8d0: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
a8e0: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
a8f0: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
a900: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
a910: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
a920: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a930: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
a940: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
a950: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
a960: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
a970: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
a980: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
a990: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
a9a0: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
a9b0: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
a9c0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a9d0: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
a9e0: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
a9f0: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
aa00: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
aa10: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
aa20: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
aa30: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
aa40: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
aa50: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
aa60: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
aa70: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
aa80: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
aa90: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
aaa0: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
aab0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
aac0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
aad0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
aae0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
aaf0: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
ab00: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
ab10: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
ab20: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
ab30: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
ab40: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
ab50: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
ab60: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
ab70: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
ab80: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
ab90: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
aba0: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
abb0: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
abc0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
abd0: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
abe0: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
abf0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ac00: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
ac10: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
ac20: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac30: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ac40: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
ac50: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
ac60: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac70: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
ac80: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
ac90: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
aca0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
acb0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
acc0: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
acd0: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
ace0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
acf0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
ad00: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
ad10: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
ad20: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ad30: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
ad40: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
ad50: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
ad60: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
ad70: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
ad80: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
ad90: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
ada0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
adb0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
adc0: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
add0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
ade0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
adf0: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
ae00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ae10: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
ae20: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
ae30: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ae40: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
ae50: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
ae60: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ae70: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
ae80: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
ae90: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
aea0: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
aeb0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aec0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
aed0: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
aee0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aef0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
af00: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
af10: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
af20: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
af30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
af40: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
af50: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
af60: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
af70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
af80: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
af90: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
afa0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
afb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
afc0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
afd0: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
afe0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aff0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b000: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
b010: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
b020: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
b030: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
b040: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
b050: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
b060: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
b070: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
b080: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
b090: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
b0a0: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
b0b0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
b0c0: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
b0d0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
b0e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b0f0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
b100: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
b110: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
b120: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
b130: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
b140: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
b150: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b160: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
b170: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
b180: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
b190: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
b1a0: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
b1b0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
b1c0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
b1d0: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
b1e0: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
b1f0: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
b200: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
b210: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b220: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
b230: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
b240: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
b250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
b260: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
b270: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
b280: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
b290: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65  ->pPager;.  Page
b2a0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20  rSavepoint *p;. 
b2b0: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b2c0: 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b  ->pgno;.  int i;
b2d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
b2e0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
b2f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
b300: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
b310: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
b320: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
b330: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
b340: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
b350: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b360: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b380: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
b390: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
b3a0: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
b3b0: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
b3c0: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
b3d0: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
b3e0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
b3f0: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
b400: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b410: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
b420: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
b430: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
b440: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
b450: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
b460: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
b470: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
b480: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
b490: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
b4a0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
b4b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
b4c0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
b4d0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
b4e0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
b4f0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
b500: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
b510: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
b520: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
b530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
b540: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
b550: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b560: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
b570: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
b580: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
b590: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
b5a0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
b5b0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
b5c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b5d0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
b5e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
b5f0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
b600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b610: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b620: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
b630: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
b640: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
b650: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
b660: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
b670: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
b680: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a  e((u8*)A,B).../*
b690: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b6a0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b6b0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b6c0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
b6d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
b6e0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
b6f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b700: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b710: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
b720: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
b730: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
b740: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
b750: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
b760: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
b770: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
b780: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
b790: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
b7a0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
b7b0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
b7c0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
b7d0: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
b7e0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
b7f0: 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52  _LOCK.** or SHAR
b800: 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c  ED_LOCK. Regardl
b810: 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
b820: 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74  r not the call t
b830: 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73  o xUnlock().** s
b840: 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65  ucceeds, set the
b850: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
b860: 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74  iable to match t
b870: 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e  he (attempted) n
b880: 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45  ew lock..**.** E
b890: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
b8a0: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
b8b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
b8c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
b8d0: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  is.** called, do
b8e0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20   not modify it. 
b8f0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
b900: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
b910: 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e  e of .** UNKNOWN
b920: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
b930: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  lanation of this
b940: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b950: 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61  pagerUnlockDb(Pa
b960: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b970: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
b980: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
b990: 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
b9a0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
b9b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
b9c0: 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73  k==eLock );.  as
b9d0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f  sert( eLock==NO_
b9e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53  LOCK || eLock==S
b9f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
ba00: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e  assert( eLock!=N
ba10: 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55  O_LOCK || pagerU
ba20: 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
ba30: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
ba40: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
ba50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ba60: 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  er->eLock>=eLock
ba70: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   );.    rc = pPa
ba80: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
ba90: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
baa0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
bab0: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
bac0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
bad0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
bae0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
baf0: 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65  r->eLock = (u8)e
bb00: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lock;.    }.    
bb10: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
bb20: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
bb30: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20  r, eLock)).  }. 
bb40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bb50: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61  *.** Lock the da
bb60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bb70: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bb80: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bb90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a   SHARED_LOCK,.**
bba0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
bbb0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
bbc0: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
bbd0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
bbe0: 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  et the.** Pager.
bbf0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
bc00: 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  o the new lockin
bc10: 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  g state. .**.** 
bc20: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bc30: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bc40: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bc50: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
bc60: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20   is .** called, 
bc70: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
bc80: 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20   unless the new 
bc90: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73  locking state is
bca0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
bcb0: 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d   .** See the com
bcc0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
bcd0: 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57  define of UNKNOW
bce0: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
bcf0: 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66  planation .** of
bd00: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
bd10: 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62   int pagerLockDb
bd20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bd30: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
bd40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bd50: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  ;..  assert( eLo
bd60: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bd70: 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  || eLock==RESERV
bd80: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bd90: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
bda0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
bdb0: 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c  ->eLock<eLock ||
bdc0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bdd0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
bde0: 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
bdf0: 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45  >noLock ? SQLITE
be00: 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c  _OK : sqlite3OsL
be10: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
be20: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
be30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
be40: 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21   (pPager->eLock!
be50: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65  =UNKNOWN_LOCK||e
be60: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
be70: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70  LOCK) ){.      p
be80: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
be90: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  u8)eLock;.      
bea0: 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
beb0: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
bec0: 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20   eLock)).    }. 
bed0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
bef0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
bf00: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
bf10: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
bf20: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
bf30: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
bf40: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
bf50: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bf60: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
bf70: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
bf80: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
bf90: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
bfa0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
bfb0: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
bfc0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
bfd0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
bfe0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
bff0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
c000: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
c010: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
c020: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
c030: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
c040: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
c050: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
c060: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
c070: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
c080: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
c090: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
c0a0: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
c0b0: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
c0c0: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
c0d0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
c0e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
c0f0: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
c100: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
c110: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
c120: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
c130: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
c140: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c150: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
c160: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c170: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
c180: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
c190: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
c1a0: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
c1b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c1c0: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
c1d0: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
c1e0: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
c1f0: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
c200: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
c210: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
c220: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
c230: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c250: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
c260: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
c270: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
c2a0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
c2b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c2c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
c2d0: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
c2e0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
c2f0: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
c300: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
c310: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c320: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
c330: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
c340: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c350: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
c360: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
c370: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
c380: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c390: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
c3a0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
c3b0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
c3c0: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
c3d0: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
c3e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c3f0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
c400: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
c410: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
c420: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
c430: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
c440: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c450: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
c460: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
c470: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
c480: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c490: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
c4a0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
c4b0: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
c4c0: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
c4d0: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
c4e0: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
c4f0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
c500: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
c510: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
c520: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c530: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
c540: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
c550: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
c560: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
c570: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
c580: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
c590: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
c5a0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
c5b0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
c5c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
c5d0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
c5e0: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
c5f0: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
c600: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
c610: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
c620: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
c630: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
c640: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
c650: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
c660: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
c670: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
c680: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
c690: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
c6a0: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
c6b0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
c6c0: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
c6d0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c6e0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
c6f0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
c700: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
c710: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
c720: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
c730: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
c740: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
c750: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
c760: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
c770: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
c780: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
c790: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
c7a0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
c7b0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
c7c0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
c7d0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c7e0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
c7f0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
c800: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
c810: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
c820: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
c830: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
c840: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
c850: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
c860: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
c870: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
c880: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
c890: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
c8a0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
c8b0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
c8c0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
c8d0: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c8e0: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
c8f0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
c900: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
c910: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c920: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
c930: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
c950: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
c960: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c970: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
c980: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
c990: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c9a0: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
c9b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c9c0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
c9d0: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
c9e0: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
c9f0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
ca00: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
ca10: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
ca20: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
ca30: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
ca40: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
ca50: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
ca60: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
ca70: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
ca80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ca90: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
caa0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
cab0: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
cac0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
cad0: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
cae0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
caf0: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
cb00: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
cb10: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
cb20: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
cb30: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
cb40: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
cb50: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
cb60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cb70: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
cb80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
cb90: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
cba0: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
cbb0: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
cbc0: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
cbd0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cbe0: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
cbf0: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
cc00: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
cc10: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
cc20: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
cc30: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
cc40: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cc50: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
cc60: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
cc70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
cc80: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
cc90: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
cca0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
ccb0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
ccc0: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
ccd0: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
cce0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
ccf0: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
cd00: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
cd10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
cd20: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
cd30: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
cd40: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
cd50: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
cd60: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
cd70: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
cd80: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
cd90: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
cda0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
cdb0: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
cdc0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
cdd0: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
cde0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
cdf0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ce00: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
ce10: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
ce20: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
ce30: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
ce40: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
ce50: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ce60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ce70: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
ce80: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
ce90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
cea0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
ceb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cec0: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
ced0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cee0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
cef0: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
cf00: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
cf10: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
cf40: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
cf50: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
cf60: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
cf70: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
cf80: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
cf90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
cfa0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
cfb0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
cfc0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
cfd0: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
cfe0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
cff0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
d000: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
d010: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
d020: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
d030: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
d040: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d050: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d060: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
d070: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
d080: 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20    || len==0 .   
d090: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d0a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
d0b0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
d0c0: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
d0d0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d0e0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
d0f0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
d100: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
d110: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
d120: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
d130: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d140: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d150: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
d160: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
d170: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
d180: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
d190: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
d1a0: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
d1b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d1c0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
d1d0: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
d1e0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
d1f0: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
d200: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
d210: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
d220: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
d230: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
d240: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
d250: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
d260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
d270: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d280: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
d290: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
d2a0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
d2b0: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
d2c0: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
d2d0: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
d2e0: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
d2f0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
d300: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
d310: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
d320: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
d330: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
d340: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d350: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d360: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
d370: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
d380: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
d390: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
d3a0: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
d3b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d3c0: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
d3d0: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
d3e0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
d3f0: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
d400: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
d410: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
d420: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
d430: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
d440: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
d450: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
d480: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d490: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
d4a0: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
d4b0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d4c0: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
d4e0: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
d510: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
d520: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
d530: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
d540: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
d550: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
d560: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
d570: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
d580: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
d590: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
d5a0: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
d5b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
d5c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
d5d0: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
d5e0: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
d5f0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d600: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
d610: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
d620: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d630: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
d640: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
d650: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d660: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
d670: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d680: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d690: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d6a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
d6b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
d6c0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
d6d0: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
d6e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
d6f0: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
d700: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
d710: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
d720: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
d730: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
d740: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d750: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
d760: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
d770: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d780: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d790: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
d7a0: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
d7b0: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
d7c0: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
d7d0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
d7e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
d7f0: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
d800: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
d810: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
d820: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
d830: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
d840: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
d850: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
d860: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
d870: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
d880: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
d890: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
d8a0: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
d8b0: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
d8c0: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
d8d0: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
d8e0: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
d8f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
d900: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
d910: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
d920: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
d930: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d940: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
d950: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
d960: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
d970: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
d980: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
d990: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
d9a0: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
d9b0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
d9c0: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
d9d0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
d9e0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
d9f0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
da00: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
da10: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
da20: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
da30: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
da40: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
da50: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
da60: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
da70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
daa0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
dab0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
dac0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
dad0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
dae0: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
daf0: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
db00: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
db10: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
db20: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
db30: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
db40: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
db50: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
db60: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
db70: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
db80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
db90: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
dba0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
dbb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
dbc0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
dbd0: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
dbe0: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
dbf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
dc00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
dc10: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
dc20: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
dc30: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
dc40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
dc50: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
dc60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc70: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
dc80: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
dc90: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
dca0: 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
dcb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
dcc0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
dcd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
dce0: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
dcf0: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
dd00: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
dd10: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
dd20: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
dd30: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
dd40: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
dd50: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
dd60: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
dd70: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
dd80: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
dd90: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
dda0: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
ddb0: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
ddc0: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
ddd0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
dde0: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
ddf0: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
de00: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
de10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
de20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
de30: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
de40: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
de50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
de60: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
de70: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
de80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
de90: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
dea0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
deb0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
dec0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
ded0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
dee0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
def0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
df00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
df10: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
df20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
df30: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
df40: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
df50: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
df60: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
df70: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
df80: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
df90: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
dfa0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
dfb0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
dfc0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
dfd0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
dfe0: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
dff0: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
e000: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
e010: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
e020: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
e030: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
e040: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
e050: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
e060: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
e070: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
e080: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
e090: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
e0a0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
e0b0: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
e0c0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
e0d0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
e0e0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
e0f0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
e100: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
e110: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
e120: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
e130: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
e140: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
e150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e160: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
e170: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
e180: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e190: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e1a0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
e1b0: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
e1c0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
e1d0: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
e1e0: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
e1f0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
e200: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
e210: 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61  eader = (u32)pPa
e220: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a  ger->pageSize;/*
e230: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
e240: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
e250: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e260: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e280: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
e290: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
e2a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e2d0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e2e0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
e2f0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
e300: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
e310: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e320: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
e330: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
e340: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
e350: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
e360: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e370: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
e380: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
e390: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
e3a0: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
e3b0: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
e3c0: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
e3d0: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
e3e0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
e3f0: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
e400: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
e410: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
e420: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
e430: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
e440: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
e450: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
e460: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
e470: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
e480: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
e490: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
e4a0: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
e4b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e4c0: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
e4d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
e4e0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
e4f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
e500: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
e510: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
e520: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
e530: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
e540: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
e550: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
e560: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
e570: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
e580: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
e590: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
e5a0: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
e5b0: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
e5c0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
e5d0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e5e0: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
e5f0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
e600: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
e610: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
e620: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
e630: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
e640: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
e650: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
e660: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
e670: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
e680: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
e690: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
e6a0: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
e6b0: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
e6c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
e6d0: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
e6e0: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
e6f0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
e700: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
e710: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
e720: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
e730: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
e740: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
e750: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
e760: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e770: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
e780: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
e790: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
e7a0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
e7b0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
e7c0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
e7d0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
e7e0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
e7f0: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
e800: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e810: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
e820: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
e830: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
e840: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
e850: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
e860: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
e870: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e880: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
e890: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
e8a0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
e8b0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
e8c0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
e8d0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
e8e0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
e8f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
e900: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e910: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
e920: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
e930: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e940: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
e950: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e960: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e970: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
e980: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
e990: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
e9a0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
e9b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e9c0: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
e9d0: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
e9e0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
e9f0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
ea00: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
ea10: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ea20: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea30: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
ea40: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
ea50: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
ea60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
ea70: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
ea80: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
ea90: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
eaa0: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20  nitializer */ . 
eab0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
eac0: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
ead0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
eae0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
eaf0: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
eb00: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eb10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
eb20: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
eb30: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
eb40: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
eb50: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
eb60: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb70: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb80: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
eb90: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
eba0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
ebb0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
ebc0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
ebd0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
ebe0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ebf0: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
ec00: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
ec10: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
ec20: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ec30: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ec40: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ec50: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
ec60: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
ec70: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
ec80: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
ec90: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
eca0: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
ecb0: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
ecc0: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
ecd0: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
ece0: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
ecf0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
ed00: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
ed10: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
ed20: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
ed30: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
ed40: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
ed50: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
ed60: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
ed70: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
ed80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed90: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
eda0: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
edb0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
edc0: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
edd0: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
ede0: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
edf0: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
ee00: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
ee10: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
ee20: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
ee30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
ee40: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
ee50: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
ee60: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
ee70: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
ee80: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
ee90: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
eea0: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
eeb0: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
eec0: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
eed0: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
eee0: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
eef0: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
ef00: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
ef10: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
ef20: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
ef30: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
ef40: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
ef50: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
ef60: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
ef70: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
ef80: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
ef90: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
efa0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
efb0: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
efc0: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
efd0: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
efe0: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
eff0: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
f000: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
f010: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
f020: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
f030: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
f040: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
f050: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
f060: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
f070: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
f080: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
f090: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
f0a0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
f0b0: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
f0c0: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
f0d0: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
f0e0: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
f0f0: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
f100: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
f110: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
f120: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
f130: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
f140: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
f150: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
f160: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
f170: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
f180: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
f190: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f1a0: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
f1b0: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
f1c0: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
f1d0: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
f1e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f1f0: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
f200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f210: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
f220: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
f230: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
f240: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
f250: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f260: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
f270: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f280: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
f290: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
f2a0: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
f2b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f2c0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
f2d0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
f2e0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
f2f0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
f300: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
f310: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f320: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
f330: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
f340: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
f350: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
f360: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f370: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f380: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
f390: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
f3a0: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
f3b0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
f3c0: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
f3d0: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
f3e0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
f3f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f400: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
f410: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
f420: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
f430: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
f440: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
f450: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
f460: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
f470: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
f480: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
f490: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
f4a0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
f4b0: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
f4c0: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
f4d0: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
f4e0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
f4f0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
f500: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f510: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f520: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
f530: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
f540: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
f550: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f560: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
f570: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
f580: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
f590: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
f5a0: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
f5b0: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
f5c0: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
f5d0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
f5e0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
f5f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
f600: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
f610: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
f620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f630: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
f640: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f660: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
f670: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
f680: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6a0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
f6b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
f6c0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
f6d0: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
f6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f6f0: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
f700: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
f710: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
f720: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f730: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f740: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
f750: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
f760: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f790: 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
f7a0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
f7b0: 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
f7c0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
f7d0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
f7e0: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f800: 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
f810: 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
f820: 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
f830: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f840: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
f850: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
f860: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
f870: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
f880: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
f890: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f8a0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
f8b0: 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
f8c0: 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
f8d0: 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
f8e0: 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
f8f0: 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
f900: 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
f910: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
f920: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
f930: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
f940: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
f950: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f960: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
f970: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f980: 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
f990: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f9a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
f9b0: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
f9c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f9d0: 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
f9e0: 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
f9f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
fa00: 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
fa10: 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
fa20: 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
fa30: 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
fa40: 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
fa50: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
fa60: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
fa70: 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
fa80: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
fa90: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
faa0: 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
fab0: 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
fac0: 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
fad0: 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
fae0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
faf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fb00: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
fb10: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
fb20: 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
fb30: 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
fb40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fb50: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
fb60: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
fb70: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
fb80: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
fb90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
fba0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fbb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fbc0: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
fbd0: 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
fbe0: 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
fbf0: 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
fc00: 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
fc10: 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
fc20: 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
fc30: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
fc40: 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
fc50: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
fc60: 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
fc70: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
fc80: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
fc90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
fca0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fcb0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
fcc0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
fcd0: 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
fce0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
fcf0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
fd00: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fd10: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
fd20: 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
fd30: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
fd40: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
fd50: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fd60: 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
fd70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fd80: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
fd90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
fda0: 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
fdb0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
fdc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
fdd0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fde0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
fdf0: 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
fe00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fe10: 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
fe20: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fe30: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
fe40: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
fe50: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
fe60: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
fe70: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
fe80: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
fe90: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fea0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
feb0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
fec0: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
fed0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
fee0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
fef0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
ff00: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
ff10: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
ff20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
ff30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69   }..    /* Versi
ff40: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
ff50: 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74  ior to 3.5.8 set
ff60: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66   the page-size f
ff70: 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ield of the.    
ff80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
ff90: 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68  r to zero. In th
ffa0: 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20  is case, assume 
ffb0: 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70  that the Pager.p
ffc0: 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76  ageSize.    ** v
ffd0: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61  ariable is alrea
ffe0: 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  dy set to the co
fff0: 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e  rrect page size.
10000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10010 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a  iPageSize==0 ){.
10020 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20        iPageSize 
10030 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
10040 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ze;.    }..    /
10050 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
10060 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
10070 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  m the page-size 
10080 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
10090 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72  fields.    ** ar
100a0 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
100b0 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27  To be 'in range'
100c0 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65  , both values ne
100d0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
100e0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67  .    ** of two g
100f0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
10100 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33  qual to 512 or 3
10110 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
10120 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
10130 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
10140 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
10150 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
10160 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10170 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
10180 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
10190 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20  SectorSize<32.  
101a0 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e     || iPageSize>
101b0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
101c0 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53  SIZE || iSectorS
101d0 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
101e0 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50  IZE.     || ((iP
101f0 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
10200 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28  Size)!=0   || ((
10210 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69  iSectorSize-1)&i
10220 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a  SectorSize)!=0 .
10230 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
10240 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68  If the either th
10250 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73  e page-size or s
10260 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68  ector-size in th
10270 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10280 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
10290 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20  valid, then the 
102a0 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
102b0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  te the journal-h
102c0 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20  eader must have 
102d0 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65  .      ** crashe
102e0 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61  d before the hea
102f0 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20  der was synced. 
10300 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f  In this case sto
10310 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20  p reading .     
10320 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10330 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
10340 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10350 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
10360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
10370 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  te the page-size
10380 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
10390 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
103a0 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  e journal. .    
103b0 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73  ** Use a testcas
103c0 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b  e() macro to mak
103d0 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c  e sure that mall
103e0 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69  oc failure withi
103f0 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53  n .    ** PagerS
10400 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20  etPagesize() is 
10410 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tested..    */. 
10420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10430 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10440 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
10450 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  ze, -1);.    tes
10460 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
10470 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
10480 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
10490 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
104a0 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
104b0 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
104c0 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
104d0 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
104e0 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
104f0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
10500 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
10510 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
10520 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
10530 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
10540 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
10550 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
10560 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
10570 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
10580 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
10590 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
105a0 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
105b0 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
105c0 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
105d0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
105e0 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
105f0 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
10600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10610 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
10620 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
10630 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
10640 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
10650 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
10660 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
10670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10680 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
10690 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
106a0 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
106b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
106c0 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
106d0 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
106e0 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
106f0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
10700 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
10710 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
10720 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
10730 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
10740 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
10750 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
10760 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
10770 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
10780 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
10790 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
107a0 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
107b0 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
107c0 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
107d0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
107e0 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
107f0 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
10800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10810 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
10820 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
10830 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
10840 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10850 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
10860 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
10870 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
10880 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
10890 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
108a0 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
108b0 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
108c0 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
108d0 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
108e0 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
108f0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
10900 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
10910 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
10920 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
10930 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
10940 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
10950 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
10960 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
10970 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
10980 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
10990 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
109a0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
109b0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
109c0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
109d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
109e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
109f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
10a00 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
10a30 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
10a40 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
10a70 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
10a80 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
10a90 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ab0 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
10ac0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
10ad0 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
10b00 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
10b10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10b20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10b30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10b40 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
10b50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
10b60 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
10b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
10b80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
10b90 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
10ba0 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61    || !isOpen(pPa
10bb0 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20  ger->jfd).  ){. 
10bc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10bd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10be0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
10bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10c00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
10c10 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
10c20 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
10c30 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
10c40 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
10c50 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
10c60 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
10c70 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
10c80 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
10c90 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
10ca0 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
10cb0 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
10cc0 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
10cd0 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
10ce0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
10cf0 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
10d00 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
10d10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10d20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
10d30 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
10d40 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
10d50 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
10d60 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
10d70 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
10d80 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
10d90 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
10da0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10db0 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
10dc0 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
10dd0 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
10de0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10df0 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
10e00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e10 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
10e20 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
10e30 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
10e40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10e50 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
10e60 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
10e70 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
10e80 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10e90 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10ea0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
10eb0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
10ec0 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
10ed0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10ee0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10ef0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
10f00 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
10f10 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10f20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10f30 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10f40 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10f50 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
10f60 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10f70 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10f80 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10f90 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
10fa0 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
10fb0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
10fc0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
10fd0 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
10fe0 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
10ff0 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
11000 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11010 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
11020 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
11030 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
11040 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11050 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
11060 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
11070 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
11080 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
11090 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
110a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
110b0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
110c0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
110d0 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
110e0 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
110f0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
11100 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
11110 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
11120 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
11130 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
11140 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
11150 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
11160 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
11170 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
11180 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
11190 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
111a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
111b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
111c0 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
111d0 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
111e0 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
111f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
11200 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
11210 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
11220 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
11230 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
11240 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11250 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
11260 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
11270 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
11280 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
11290 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
112a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
112b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
112c0 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
112d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
112e0 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
112f0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
11300 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
11310 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
11320 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11330 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
11340 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
11350 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
11360 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11370 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11380 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11390 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
113a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
113b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
113c0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61   the pPager->iDa
113d0 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a  taVersion value.
113e0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61  */.u32 sqlite3Pa
113f0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50  gerDataVersion(P
11400 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11420 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
11430 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  EN );.  return p
11440 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11450 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion;.}../*.** Fr
11460 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11470 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11480 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11490 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
114a0 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
114b0 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
114c0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
114d0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
114e0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
114f0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11500 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11510 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11520 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11530 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11540 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11550 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11570 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11580 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11590 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
115a0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
115b0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
115c0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
115d0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
115e0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
115f0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11600 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11610 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11620 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11630 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
11640 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11660 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11670 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11680 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11690 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
116a0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
116b0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
116c0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
116d0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
116e0 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
116f0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
11700 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
11710 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
11720 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
11730 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
11740 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11760 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11770 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11780 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11790 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
117a0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
117b0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
117c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
117d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
117e0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
117f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11800 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11820 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11830 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
11840 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11850 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11860 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11870 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11880 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11890 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
118a0 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
118b0 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
118c0 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
118d0 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
118e0 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
118f0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
11900 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
11910 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11920 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
11930 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
11940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11960 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11970 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11980 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11990 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
119a0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
119b0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
119c0 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
119d0 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
119e0 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
119f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11a00 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11a10 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
11a20 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
11a30 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
11a40 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11a50 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11a60 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11a70 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11a80 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11a90 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11aa0 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
11ab0 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
11ac0 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
11ad0 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11ae0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
11af0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
11b00 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
11b10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11b20 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
11b30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
11b40 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11b50 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11b60 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11b70 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11b80 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11b90 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11ba0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11bb0 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
11bc0 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
11bd0 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11be0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
11bf0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
11c00 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
11c10 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
11c20 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
11c30 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11c40 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11c50 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11c60 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11c70 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11c80 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11c90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11cb0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11cc0 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11cd0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11ce0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
11cf0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11d00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11d10 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
11d20 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11d30 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
11d40 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11d50 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11d60 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11d70 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11d80 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11d90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11db0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11dc0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11dd0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11de0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11df0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11e00 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11e10 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11e20 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11e30 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11e40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e60 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11e70 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11e80 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11e90 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11ea0 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11eb0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11ec0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11ed0 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11ee0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11ef0 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11f00 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11f10 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11f20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11f40 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11f50 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11f60 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11f70 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11f80 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11f90 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11fa0 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11fb0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11fc0 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11fd0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11fe0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ff0 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
12000 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12010 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12020 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
12030 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12040 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12050 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
12060 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12070 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12080 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
12090 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
120a0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
120b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
120c0 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
120d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
120e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
120f0 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
12100 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
12110 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
12120 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
12130 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
12140 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
12150 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
12160 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
12170 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
12180 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
12190 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
121a0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
121b0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
121c0 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
121d0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
121e0 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
121f0 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
12200 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
12210 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
12220 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
12230 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
12240 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
12250 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
12260 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
12270 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
12280 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
12290 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
122a0 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
122b0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
122c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
122d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
122e0 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
122f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
12300 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
12310 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12320 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
12330 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
12340 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12350 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12360 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12370 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
12380 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
12390 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
123a0 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
123b0 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
123c0 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
123d0 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
123e0 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
123f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12400 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12410 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
12420 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
12430 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12440 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12450 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12460 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
12480 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
12490 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
124a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
124b0 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
124c0 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
124d0 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
124e0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
124f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12500 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
12510 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
12520 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
12530 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
12540 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12550 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12560 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12570 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
12580 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12590 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
125a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
125b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
125c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
125d0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
125e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
125f0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
12600 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12610 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
12620 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12630 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45  _OK;.    if( USE
12640 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
12650 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
12660 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
12670 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  0);.  }..  pPage
12680 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
12690 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
126a0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
126b0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
126c0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
126d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
126e0 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
126f0 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
12700 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
12710 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
12720 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
12730 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
12740 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
12750 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
12760 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
12770 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12780 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12790 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
127a0 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
127b0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
127c0 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
127d0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
127e0 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
127f0 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
12800 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
12810 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
12820 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
12830 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
12840 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
12850 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
12860 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
12870 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
12880 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
12890 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
128a0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
128b0 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
128c0 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
128d0 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
128e0 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
128f0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12900 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
12910 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
12920 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
12930 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
12940 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
12950 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
12960 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
12970 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12980 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12990 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
129a0 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
129b0 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
129c0 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
129d0 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
129e0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
129f0 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12a00 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
12a10 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
12a20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
12a30 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
12a40 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
12a50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12a60 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
12a70 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
12a80 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
12a90 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
12aa0 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
12ab0 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
12ac0 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
12ad0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
12ae0 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
12af0 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
12b00 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
12b10 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
12b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12b30 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
12b40 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
12b50 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12b60 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
12b70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
12b90 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
12ba0 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
12bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
12bc0 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
12bd0 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
12be0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
12bf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12c00 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
12c10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12c20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d  PAGER_ERROR;.  }
12c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12c40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12c50 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12c60 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12c70 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
12c80 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
12c90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
12ca0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12cb0 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
12cc0 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
12cd0 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
12ce0 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
12cf0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
12d00 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
12d10 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
12d20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
12d30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
12d40 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
12d50 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
12d60 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
12d70 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
12d80 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
12d90 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
12da0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
12db0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12dc0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
12dd0 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
12de0 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
12df0 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
12e00 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
12e10 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
12e20 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
12e30 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
12e40 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
12e50 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
12e60 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
12e70 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
12e80 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
12e90 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
12ea0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
12eb0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
12ec0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
12ed0 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
12ee0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
12ef0 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
12f00 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
12f10 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
12f20 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
12f30 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
12f40 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
12f50 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
12f60 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
12f70 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
12f80 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
12f90 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
12fa0 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
12fb0 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
12fc0 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
12fd0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
12fe0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
12ff0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
13000 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
13010 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
13020 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
13030 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
13040 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13050 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13060 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
13070 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
13080 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
13090 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
130a0 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
130b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
130c0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
130d0 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
130e0 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
130f0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
13100 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
13110 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
13120 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13130 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
13140 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
13150 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13160 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
13170 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
13180 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
13190 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
131a0 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
131b0 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
131c0 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
131d0 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
131e0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
131f0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
13200 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
13210 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
13220 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
13230 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
13240 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13250 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
13260 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
13270 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
13280 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13290 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
132a0 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
132b0 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
132c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
132d0 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
132e0 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
132f0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
13300 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
13310 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
13320 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13330 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
13340 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
13350 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
13360 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
13370 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
13380 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
13390 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
133a0 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
133b0 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
133c0 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
133d0 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
133e0 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
133f0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
13400 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
13410 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
13420 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13430 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
13440 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
13450 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
13460 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13470 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
13480 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
13490 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
134a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
134b0 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
134c0 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
134d0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
134e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
134f0 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
13500 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
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 66 61 69  journal file fai
13530 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
13540 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
13550 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
13560 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
13570 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
13580 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
13590 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
135a0 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
135b0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
135c0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
135d0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
135e0 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
135f0 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
13600 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
13610 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
13620 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13630 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
13640 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
13650 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
13660 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
13670 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
13680 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
13690 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
136a0 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
136b0 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
136c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
136d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
136e0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
136f0 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
13700 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
13710 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
13720 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
13730 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
13740 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
13750 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
13760 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
13770 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
13780 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
13790 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
137a0 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
137b0 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
137c0 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
137d0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
137e0 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
137f0 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
13800 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
13810 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
13820 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
13830 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
13840 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
13850 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
13860 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
13870 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13880 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
13890 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
138a0 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
138b0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
138c0 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
138d0 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
138e0 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
138f0 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
13900 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
13910 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
13920 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
13930 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
13940 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13950 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
13960 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
13970 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
13980 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13990 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
139a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
139b0 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
139c0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
139d0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
139e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
139f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
13a00 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
13a10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
13a20 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
13a30 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
13a40 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
13a50 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
13a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a70 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
13a80 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
13a90 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
13aa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13ab0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
13ac0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13ad0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
13ae0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13af0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
13b00 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
13b10 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
13b20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13b30 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
13b40 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
13b50 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
13b60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13b90 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
13ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13bb0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13bc0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
13bd0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13be0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13bf0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13c00 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
13c10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13c20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
13c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13c50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13c60 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
13c70 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
13c80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13c90 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
13ca0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
13cb0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
13cc0 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
13cd0 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
13ce0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
13cf0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
13d00 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
13d10 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
13d20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
13d30 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
13d40 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
13d50 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
13d60 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
13d70 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
13d80 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
13d90 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
13da0 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
13db0 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
13dc0 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
13dd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
13de0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
13df0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
13e00 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
13e10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13e20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
13e30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13e40 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
13e50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13e60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13e70 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
13e80 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
13e90 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13ea0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
13eb0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
13ec0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
13ed0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
13ee0 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
13ef0 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
13f00 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
13f10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13f20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13f30 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
13f40 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  h may be execute
13f50 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75  d with Pager.jou
13f60 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
13f70 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   if.      ** a h
13f80 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  ot-journal was j
13f90 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ust rolled back.
13fa0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
13fb0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
13fc0 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  ** file should b
13fd0 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  e closed and del
13fe0 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f  eted. If this co
13ff0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
14000 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
14010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
14020 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69  t will do so usi
14030 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
14040 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20  journal. .      
14050 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  */.      int bDe
14060 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d  lete = (!pPager-
14070 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71 6c  >tempFile && sql
14080 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74  ite3JournalExist
14090 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b  s(pPager->jfd));
140a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
140b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
140c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
140d0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
140e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
140f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14100 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14110 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20  DE_MEMORY .     
14120 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
14130 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14140 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14150 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
14160 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14170 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
14180 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c 65  .      if( bDele
14190 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  te ){.        rc
141a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
141b0 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
141c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
141d0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
141e0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
141f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
14200 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61  GES.  sqlite3Pca
14210 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
14220 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14230 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
14240 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ash);.  if( pPag
14250 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26  er->dbSize==0 &&
14260 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
14270 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
14280 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
14290 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69   PgHdr *p = sqli
142a0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
142b0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69  Pager, 1);.    i
142c0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
142d0 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20  >pageHash = 0;. 
142e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
142f0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29  rUnrefNotNull(p)
14300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14310 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
14320 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14330 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
14340 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
14350 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
14360 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
14370 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
14380 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
14390 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
143a0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
143b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
143c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
143d0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
143e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
143f0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
14400 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
14410 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
14420 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14430 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14440 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14450 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14460 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14470 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14480 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14490 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
144a0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
144b0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
144c0 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
144d0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
144e0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
144f0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
14500 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
14510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14520 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14530 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14540 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14550 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14560 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14570 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14580 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14590 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
145a0 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
145b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
145c0 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
145d0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
145e0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
145f0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
14600 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
14610 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
14620 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14630 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
14640 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
14650 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
14660 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
14670 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
14680 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
14690 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
146a0 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
146b0 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
146c0 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
146d0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
146e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
146f0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
14700 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
14710 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
14720 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14730 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14740 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
14750 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d  LITE_OK && bComm
14760 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  it && isOpen(pPa
14770 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
14780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
14790 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
147a0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
147b0 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54  TL_COMMIT_PHASET
147c0 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  WO, 0);.    if( 
147d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
147e0 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UND ) rc = SQLIT
147f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
14800 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14810 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28  iveMode .   && (
14820 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
14830 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57  ger) || sqlite3W
14840 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
14850 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
14860 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ).  ){.    rc2 =
14870 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
14880 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
14890 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
148a0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
148b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
148c0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
148d0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61  ER_READER;.  pPa
148e0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
148f0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72   0;..  return (r
14900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
14910 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  :rc);.}../*.** E
14920 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
14930 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
14940 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
14950 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
14960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
14970 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14980 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
14990 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
149a0 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
149b0 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
149c0 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
149d0 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
149e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
149f0 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
14a00 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
14a10 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
14a20 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
14a30 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
14a40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14a50 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  file and move th
14a60 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
14a70 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74  OPEN state. If t
14a80 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  his .** means th
14a90 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  at there is a ho
14aa0 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69  t-journal left i
14ab0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
14ac0 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  m, the next .** 
14ad0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62  connection to ob
14ae0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
14af0 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
14b00 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
14b10 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c  is one) .** will
14b20 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
14b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14b40 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  r has not alread
14b50 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
14b60 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61  ROR state, but a
14b70 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f  n IO or.** mallo
14b80 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  c error occurs d
14b90 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
14ba0 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c  , then this will
14bb0 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a   itself cause .*
14bc0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  * the pager to e
14bd0 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73  nter the ERROR s
14be0 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c  tate. Which will
14bf0 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74   be cleared by t
14c00 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
14c10 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73  ger_unlock(), as
14c20 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
14c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14c40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
14c50 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
14c60 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
14c70 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
14c80 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61  GER_ERROR && pPa
14c90 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
14ca0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61  ER_OPEN ){.    a
14cb0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
14cc0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
14cd0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ) );.    if( pPa
14ce0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
14cf0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
14d00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14d10 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14d20 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
14d30 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
14d40 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14d50 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14d60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65  Malloc();.    }e
14d70 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
14d80 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
14d90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14da0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
14db0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
14dc0 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f        pager_end_
14dd0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
14de0 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
14df0 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
14e00 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ock(pPager);.}..
14e10 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
14e20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74  aData must point
14e30 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
14e40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14e50 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
14e60 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  a. Compute and r
14e70 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
14e80 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63   based ont the c
14e90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
14ea0 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20  ** page of data 
14eb0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
14ec0 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d  value of pPager-
14ed0 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a  >cksumInit..**.*
14ee0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
14ef0 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49  real checksum. I
14f00 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
14f10 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
14f20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
14f30 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72  al value (pPager
14f40 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64  ->cksumInit) and
14f50 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74   every 200th byt
14f60 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
14f70 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20   data, starting 
14f80 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74  with byte offset
14f90 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
14fa0 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68  ze%200)..** Each
14fb0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
14fc0 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74  eted as an 8-bit
14fd0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
14fe0 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e  r..**.** Changin
14ff0 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  g the formula us
15000 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
15010 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75  is checksum resu
15020 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63  lts in an.** inc
15030 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61  ompatible journa
15040 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a  l file format..*
15050 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20  *.** If journal 
15060 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
15070 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
15080 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
15090 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63  st likely .** sc
150a0 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f  enario is that o
150b0 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
150c0 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
150d0 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
150e0 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63  d. .** It is muc
150f0 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
15100 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
15110 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
15120 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
15130 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
15140 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
15150 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
15160 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
15170 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
15180 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
15190 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
151a0 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
151b0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
151c0 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
151d0 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
151e0 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
151f0 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
15200 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
15210 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
15220 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  /* Checksum valu
15230 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
15240 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
15250 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20  >pageSize-200;  
15260 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15270 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69  counter */.  whi
15280 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
15290 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
152a0 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
152b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
152c0 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  um;.}../*.** Rep
152d0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
152e0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75  page size and nu
152f0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15300 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74   bytes back.** t
15310 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a  o the codec..*/.
15320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15330 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76  S_CODEC.static v
15340 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53  oid pagerReportS
15350 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
15360 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15370 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
15380 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15390 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70  xCodecSizeChng(p
153a0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70  Pager->pCodec, p
153b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
153c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
153d0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
153e0 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76  )pPager->nReserv
153f0 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  e);.  }.}.#else.
15400 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65  # define pagerRe
15410 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20  portSize(X)     
15420 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64  /* No-op if we d
15430 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20  o not support a 
15440 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a  codec */.#endif.
15450 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
15460 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65  ngle page from e
15470 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ither the journa
15480 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69  l file (if isMai
15490 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20  nJrnl==1) or.** 
154a0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
154b0 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a  rnal (if isMainJ
154c0 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79  rnl==0) and play
154d0 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a  back that page..
154e0 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69  ** The page begi
154f0 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f  ns at offset *pO
15500 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
15510 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65  ile. The *pOffse
15520 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e  t.** value is in
15530 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73  creased to the s
15540 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
15550 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
15560 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
15570 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
15580 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b  urnal uses check
15590 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
155a0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
155b0 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  s .** not..**.**
155c0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
155d0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
155e0 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
155f0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15600 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
15610 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
15620 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
15630 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
15640 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
15650 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
15660 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15670 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
15680 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
15690 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
156a0 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
156b0 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
156c0 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
156d0 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
156e0 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
156f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
15700 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
15710 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
15720 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
15730 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
15740 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
15750 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
15760 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
15770 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
15780 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
15790 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
157a0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
157b0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
157c0 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
157d0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
157e0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
157f0 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
15800 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
15810 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15820 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
15830 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
15840 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
15850 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
15860 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15870 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
15880 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
15890 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
158a0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
158b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
158c0 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
158d0 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
158e0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
158f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
15900 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
15910 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
15920 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
15930 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
15940 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
15950 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
15960 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
15970 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15980 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
15990 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
159a0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
159b0 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
159c0 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
159d0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
159e0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
159f0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
15a00 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
15a10 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
15a20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
15a30 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
15a40 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
15a50 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
15a60 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
15a70 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
15a80 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
15a90 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
15aa0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
15ab0 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
15ac0 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
15ad0 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
15ae0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
15af0 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
15b00 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
15b10 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
15b20 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
15b30 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
15b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
15b50 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
15b60 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
15b70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
15b80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15b90 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
15ba0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a   back */.  i64 *
15bb0 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
15bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
15bd0 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
15be0 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69  playback */.  Bi
15bf0 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20  tvec *pDone,    
15c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
15c10 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
15c20 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
15c30 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
15c40 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
15c50 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
15c60 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
15c70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
15c80 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74  .  int isSavepnt
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
15cb0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15cc0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
15cd0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
15d00 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
15d10 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
15d20 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
15d30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
15d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
15d50 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
15d60 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
15d90 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
15da0 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  cking */.  char 
15db0 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
15dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
15dd0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f  orary storage fo
15de0 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  r the page */.  
15df0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
15e00 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
15e10 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
15e20 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75  ptor for the jou
15e30 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
15e40 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20  nt isSynced;    
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e60 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
15e70 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a  page is synced *
15e80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
15e90 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
15ea0 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
15eb0 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
15ec0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
15ed0 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
15ee0 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
15ef0 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
15f00 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
15f10 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
15f20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
15f30 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
15f40 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
15f50 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
15f60 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
15f70 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
15f80 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
15f90 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
15fa0 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70  Data = pPager->p
15fb0 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65  TmpSpace;.  asse
15fc0 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20  rt( aData );    
15fd0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
15fe0 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  rage must have a
15ff0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
16000 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  cated */.  asser
16010 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
16020 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69  Pager)==0 || (!i
16030 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53  sMainJrnl && isS
16040 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a  avepnt) );..  /*
16050 20 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74   Either the stat
16060 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
16070 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  n PAGER_WRITER_C
16080 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73  ACHEMOD (a trans
16090 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20  action .  ** or 
160a0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
160b0 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72  ck done at the r
160c0 65 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61  equest of the ca
160d0 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73  ller) or this is
160e0 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
160f0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66  nal rollback. If
16100 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75   it is a hot-jou
16110 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  rnal rollback, t
16120 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73  he pager.  ** is
16130 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61   in state OPEN a
16140 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c  nd holds an EXCL
16150 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d  USIVE lock. Hot-
16160 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16170 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73  .  ** only reads
16180 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
16190 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20  ournal, not the 
161a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  sub-journal..  *
161b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
161c0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
161d0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
161e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  D.       || (pPa
161f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
16200 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65  ER_OPEN && pPage
16210 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
16220 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20  IVE_LOCK).  );. 
16230 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16240 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16250 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c  RITER_CACHEMOD |
16260 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a  | isMainJrnl );.
16270 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
16280 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
16290 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
162a0 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
162b0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
162c0 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
162d0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
162e0 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
162f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
16300 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
16310 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
16320 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
16330 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
16340 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
16350 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
16360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16370 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16380 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
16390 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
163a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
163b0 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
163c0 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
163d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
163e0 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
163f0 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
16400 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
16410 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
16420 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
16430 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
16440 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
16450 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
16460 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
16470 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
16480 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
16490 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
164a0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
164b0 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
164c0 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
164d0 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
164e0 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
164f0 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
16500 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
16510 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
16520 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
16530 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
16540 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
16550 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
16560 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
16570 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
16580 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
16590 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
165a0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
165b0 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
165c0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
165d0 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
165e0 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
165f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16610 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
16620 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
16630 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
16640 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
16650 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
16660 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
16670 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
16680 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
16690 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
166a0 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
166b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
166c0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
166d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
166e0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
166f0 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66  en played by bef
16700 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
16710 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
16720 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
16730 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
16740 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
16750 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
16760 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
16770 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
16780 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
16790 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
167a0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
167b0 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
167c0 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
167d0 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
167e0 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
167f0 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
16800 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
16810 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
16820 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
16830 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
16840 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
16850 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
16860 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
16870 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
16880 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
16890 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
168a0 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
168b0 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
168c0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
168d0 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
168e0 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
168f0 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
16900 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
16910 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
16920 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
16930 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
16940 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
16950 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
16960 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
16970 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
16980 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
16990 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
169a0 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
169b0 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
169c0 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
169d0 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
169e0 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
169f0 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
16a00 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
16a10 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
16a20 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
16a30 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
16a40 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
16a50 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
16a60 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
16a70 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
16a80 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
16a90 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
16aa0 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
16ab0 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
16ac0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
16ad0 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
16ae0 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
16af0 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
16b00 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
16b10 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
16b20 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
16b30 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
16b40 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
16b50 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
16b60 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
16b70 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
16b80 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
16b90 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
16ba0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
16bb0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16bc0 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
16bd0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
16be0 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
16bf0 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
16c00 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
16c10 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
16c20 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
16c30 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
16c40 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
16c50 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
16c60 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
16c70 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
16c80 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
16c90 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
16ca0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
16cb0 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
16cc0 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
16cd0 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
16ce0 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
16cf0 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
16d00 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
16d10 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
16d20 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
16d30 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
16d40 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
16d50 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
16d60 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
16d70 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
16d80 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
16d90 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
16da0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16db0 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
16dc0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
16dd0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
16de0 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
16df0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
16e00 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
16e10 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
16e20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16e30 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
16e40 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
16e50 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
16e60 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
16e70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
16e80 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
16e90 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
16ea0 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
16eb0 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
16ec0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
16ed0 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
16ee0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
16ef0 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
16f00 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
16f10 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
16f20 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
16f30 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
16f40 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
16f50 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
16f60 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
16f70 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
16f80 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
16f90 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
16fa0 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
16fb0 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
16fc0 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
16fd0 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
16fe0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
16ff0 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
17000 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
17010 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
17020 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
17030 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
17040 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
17050 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
17060 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
17070 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
17080 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
17090 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
170a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
170b0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
170c0 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e{.    pPg = sql
170d0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
170e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
170f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
17100 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
17110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17120 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
17130 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
17140 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
17150 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
17160 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
17170 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17180 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
17190 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
171a0 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
171b0 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
171c0 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
171d0 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
171e0 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
171f0 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
17200 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17210 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
17220 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
17230 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
17240 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
17250 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
17260 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
17270 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
17280 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
17290 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
172a0 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
172b0 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
172c0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
172d0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
172e0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
172f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
17300 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
17310 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
17320 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
17330 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
17340 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
17350 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
17360 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
17370 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
17380 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
17390 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
173a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
173b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
173c0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
173d0 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44  er->fd, (u8 *)aD
173e0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
173f0 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
17400 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
17410 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
17420 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
17430 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
17440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17450 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
17460 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
17470 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
17480 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17490 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
174a0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
174b0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
174c0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
174d0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
174e0 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
174f0 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
17500 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
17510 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
17520 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
17530 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
17540 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17550 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
17560 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
17570 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
17580 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
17590 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
175a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
175b0 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
175c0 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
175d0 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
175e0 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
175f0 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
17600 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
17610 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
17620 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
17630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17640 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
17650 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
17660 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
17670 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
17680 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
17690 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
176a0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
176b0 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
176c0 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
176d0 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
176e0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
176f0 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
17700 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
17710 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
17720 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
17730 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17740 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
17750 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
17760 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
17770 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
17780 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
17790 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
177a0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
177b0 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
177c0 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
177d0 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
177e0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
177f0 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
17800 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
17810 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
17820 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
17830 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
17840 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
17850 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
17860 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
17870 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
17880 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
17890 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
178a0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
178b0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
178c0 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
178d0 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
178e0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
178f0 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b  _ROLLBACK)==0 );
17900 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17910 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
17920 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
17930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17940 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
17950 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
17960 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
17970 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
17980 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
17990 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
179a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
179b0 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
179c0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
179d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
179e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
179f0 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
17a00 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17a10 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
17a20 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17a30 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17a40 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17a50 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17a60 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
17a70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
17a80 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
17a90 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
17aa0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
17ab0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
17ac0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
17ad0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17ae0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
17af0 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
17b00 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
17b10 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
17b20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17b30 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17b40 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17b50 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17b60 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
17b70 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
17b80 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
17b90 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
17ba0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
17bb0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
17bc0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17bd0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17be0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17bf0 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17c00 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17c10 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17c20 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17c30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17c40 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17c50 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17c60 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
17c70 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
17c80 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
17c90 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
17ca0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
17cb0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
17cc0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17cd0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17ce0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17cf0 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17d00 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17d10 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17d20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17d30 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17d40 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17d50 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17d60 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
17d70 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
17d80 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
17d90 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
17da0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
17db0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
17dc0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17dd0 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17de0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17df0 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17e00 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17e10 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17e20 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17e30 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17e40 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17e50 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17e60 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
17e70 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
17e80 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
17e90 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
17ea0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
17eb0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
17ec0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17ed0 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17ee0 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17ef0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17f00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17f10 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17f20 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17f30 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17f40 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17f50 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17f60 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
17f70 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
17f80 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
17f90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
17fa0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
17fb0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
17fc0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17fd0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17fe0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17ff0 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
18000 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
18010 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
18020 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
18030 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
18040 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
18050 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
18060 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
18070 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
18080 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
18090 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
180a0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
180b0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
180c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
180d0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
180e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
180f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
18100 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
18110 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
18120 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
18130 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
18140 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
18150 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
18160 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
18170 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
18180 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
18190 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
181a0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
181b0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
181c0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
181d0 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
181e0 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
181f0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
18200 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
18210 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
18220 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
18230 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
18240 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
18250 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
18260 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
18270 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
18280 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18290 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
182a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
182b0 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
182c0 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
182d0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
182e0 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
182f0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
18300 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
18310 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
18320 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
18330 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
18340 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
18350 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
18360 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
18370 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
18380 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18390 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
183a0 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
183b0 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
183c0 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
183d0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
183e0 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
183f0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
18400 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
18410 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
18420 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
18430 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18440 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
18450 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
18460 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
18470 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
18480 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
18490 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
184a0 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
184b0 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
184c0 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
184d0 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
184e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
184f0 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
18500 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
18510 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
18520 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
18530 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
18540 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
18550 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
18560 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
18570 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
18580 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
18590 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
185a0 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
185b0 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
185c0 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
185d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
185e0 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
185f0 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
18600 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
18610 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
18620 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
18630 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18640 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
18650 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
18660 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
18670 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
18680 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
18690 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
186a0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
186b0 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
186c0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
186d0 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
186e0 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
186f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
18700 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
18710 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
18720 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
18730 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
18740 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
18750 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
18760 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
18770 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
18780 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
18790 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
187a0 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
187b0 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
187c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
187d0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
187e0 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
187f0 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
18800 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
18810 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
18820 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
18830 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
18840 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
18850 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
18860 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
18870 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
18880 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
18890 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
188a0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
188b0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
188c0 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
188d0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
188e0 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
188f0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
18900 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
18910 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
18920 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
18930 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
18940 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
18950 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18960 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
18970 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
18980 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
18990 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
189a0 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
189b0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
189c0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
189d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
189e0 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
189f0 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
18a00 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
18a10 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
18a20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18a30 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18a40 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18a50 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18a60 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
18a70 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
18a80 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
18a90 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
18aa0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18ac0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
18ad0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
18ae0 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
18af0 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
18b00 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18b10 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
18b20 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18b30 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18b40 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18b50 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18b60 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
18b70 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
18b80 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
18b90 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
18ba0 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
18bb0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
18bc0 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18bd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18be0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18bf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18c00 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18c10 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18c20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18c30 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18c40 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18c50 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18c60 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
18c70 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
18c80 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
18c90 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
18ca0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
18cb0 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
18cc0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18cd0 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18ce0 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18cf0 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18d00 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18d10 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18d20 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18d40 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18d50 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18d60 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
18d70 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
18d80 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
18d90 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
18da0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
18db0 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
18dc0 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18dd0 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18de0 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18df0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18e00 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18e10 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
18e20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18e30 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18e40 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
18e50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18e60 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
18e70 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
18e80 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
18e90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18ea0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
18eb0 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
18ec0 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
18ed0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18ee0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
18ef0 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
18f00 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
18f10 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
18f20 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
18f30 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
18f40 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
18f50 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
18f60 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
18f70 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
18f80 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
18f90 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
18fa0 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
18fb0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
18fc0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18fd0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
18fe0 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
18ff0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
19000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19010 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19020 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
19030 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
19040 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
19050 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
19060 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
19070 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
19080 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
19090 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
190a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
190b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
190c0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
190d0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
190e0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
190f0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
19100 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
19110 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
19120 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
19130 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
19140 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
19150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19160 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
19170 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
19180 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
19190 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
191a0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
191b0 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
191c0 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
191d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
191e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
191f0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
19200 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19210 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
19220 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
19230 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
19240 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
19250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19260 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
19270 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19280 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
19290 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
192a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
192b0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
192c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
192d0 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
192e0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
192f0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
19300 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
19310 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
19320 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
19330 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
19340 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19350 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
19360 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
19370 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
19380 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
19390 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
193a0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
193b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
193c0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
193d0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
193e0 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
193f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19410 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19420 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19430 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
19440 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
19450 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
19460 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
19470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
19480 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
19490 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
194a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
194b0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
194c0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
194d0 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
194e0 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
194f0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
19500 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
19510 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
19520 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
19530 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
19540 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
19550 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19560 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
19570 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19590 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
195a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
195b0 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
195c0 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
195d0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
195e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
195f0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
19600 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
19610 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
19620 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
19630 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
19640 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
19650 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
19660 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
19670 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
19680 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
19690 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
196a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
196b0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
196c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
196d0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
196e0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
196f0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
19700 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
19710 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
19720 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
19730 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
19740 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
19750 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
19760 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
19770 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
19780 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
19790 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
197a0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
197b0 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
197c0 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
197d0 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
197e0 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
197f0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
19800 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
19810 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
19820 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
19830 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
19840 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
19850 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
19860 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
19870 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
19880 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
19890 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
198a0 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
198b0 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
198c0 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
198d0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
198e0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
198f0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
19900 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
19910 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
19920 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
19930 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
19940 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
19950 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
19960 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
19970 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
19980 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
19990 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
199a0 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
199b0 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
199c0 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
199d0 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
199e0 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
199f0 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
19a00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19a10 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
19a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
19a30 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
19a40 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
19a50 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
19a60 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
19a70 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
19a80 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
19a90 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
19aa0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
19ab0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
19ac0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
19ad0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
19ae0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19af0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
19b00 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19b10 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
19b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19b30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
19b40 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
19b50 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
19b60 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
19b70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
19b80 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
19b90 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
19ba0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
19bb0 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
19bc0 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
19bd0 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
19be0 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
19bf0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
19c00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
19c10 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
19c20 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  CK );.    /* TOD
19c30 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
19c40 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
19c50 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
19c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19c70 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
19c80 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
19c90 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
19ca0 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e   = szPage*(i64)n
19cb0 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
19cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
19cd0 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
19ce0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
19cf0 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
19d00 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
19d10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
19d20 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
19d30 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
19d40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75     }else if( (cu
19d50 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65  rrentSize+szPage
19d60 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  )<=newSize ){.  
19d70 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
19d80 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
19d90 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
19da0 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
19db0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
19dc0 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
19dd0 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
19de0 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
19df0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19e00 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
19e10 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
19e20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
19e30 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
19e40 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
19e50 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
19e60 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
19e70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19e90 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
19ea0 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
19eb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19ed0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
19ee0 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f  sanitized versio
19ef0 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d  n of the sector-
19f00 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20  size of OS file 
19f10 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65  pFile. The.** re
19f20 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75  turn value is gu
19f30 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20  aranteed to lie 
19f40 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d  between 32 and M
19f50 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
19f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
19f70 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
19f80 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
19f90 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69   int iRet = sqli
19fa0 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
19fb0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52  pFile);.  if( iR
19fc0 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65  et<32 ){.    iRe
19fd0 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  t = 512;.  }else
19fe0 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45   if( iRet>MAX_SE
19ff0 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
1a000 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
1a010 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
1a020 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f  .    iRet = MAX_
1a030 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1a040 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
1a050 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1a060 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
1a070 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1a080 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
1a090 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
1a0a0 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
1a0b0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1a0c0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
1a0d0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
1a0e0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1a0f0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
1a100 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
1a110 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1a120 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1a130 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1a140 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1a150 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1a160 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1a170 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1a180 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1a190 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a1a0 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1a1b0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1a1c0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1a1d0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1a1e0 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1a1f0 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1a200 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a210 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1a220 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1a230 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1a240 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1a250 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1a260 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1a270 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1a280 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1a290 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1a2a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1a2b0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a2c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1a2d0 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1a2e0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1a2f0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1a300 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1a310 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1a320 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1a330 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1a340 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1a350 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1a360 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1a370 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1a380 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1a390 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1a3a0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1a3b0 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1a3c0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1a3d0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1a3e0 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1a3f0 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1a400 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1a410 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1a420 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1a430 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1a440 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1a450 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1a460 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1a470 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1a480 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1a490 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1a4a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1a4b0 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1a4c0 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1a4d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a4e0 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1a4f0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1a500 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1a510 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a520 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1a530 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1a540 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a550 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1a560 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1a570 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1a580 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1a590 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1a5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1a5b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1a5c0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1a5d0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1a5e0 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1a5f0 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1a600 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1a610 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1a620 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1a630 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1a640 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1a650 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1a660 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1a670 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1a680 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1a690 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1a6a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1a6b0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a6c0 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1a6d0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1a6e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1a6f0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1a700 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1a710 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1a720 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1a730 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1a740 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1a750 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1a760 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1a770 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1a780 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1a790 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1a7a0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1a7b0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1a7c0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1a7d0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1a7e0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1a7f0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1a800 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1a810 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1a820 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1a830 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1a840 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1a850 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1a860 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1a870 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1a880 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1a890 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1a8a0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a8b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a8c0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1a8d0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1a8e0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1a8f0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1a900 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1a910 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1a920 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1a930 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1a940 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1a950 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1a960 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1a970 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1a980 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a990 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1a9a0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1a9b0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1a9c0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1a9d0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1a9e0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a9f0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1aa00 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1aa10 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1aa20 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1aa30 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1aa40 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1aa50 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1aa60 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1aa70 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1aa80 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1aa90 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1aaa0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1aab0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1aac0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1aad0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1aae0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1aaf0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1ab00 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1ab10 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1ab20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1ab30 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1ab40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1ab50 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1ab60 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1ab70 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1ab80 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1ab90 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1aba0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1abb0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1abc0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1abd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1abe0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1abf0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1ac00 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1ac10 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1ac20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1ac30 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1ac40 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1ac50 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1ac60 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1ac70 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1ac80 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1ac90 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1aca0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1acb0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1acc0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1acd0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1ace0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1acf0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1ad00 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1ad10 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1ad20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1ad30 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1ad40 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1ad50 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1ad60 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1ad70 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1ad80 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1ad90 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1ada0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1adb0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1adc0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1add0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1ade0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1adf0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1ae00 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1ae10 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1ae20 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1ae30 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1ae40 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1ae50 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1ae60 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1ae70 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1ae80 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1ae90 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1aea0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1aeb0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1aec0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1aed0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1aee0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1aef0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1af00 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1af10 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1af20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1af30 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1af40 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1af50 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1af60 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1af70 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1af80 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1af90 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1afa0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1afb0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1afc0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1afd0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1afe0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1aff0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1b000 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1b010 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1b020 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1b030 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1b040 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1b050 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1b060 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1b070 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1b080 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1b090 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1b0a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1b0b0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1b0c0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1b0d0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1b0e0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1b0f0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1b100 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1b110 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1b120 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b130 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1b140 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1b150 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1b160 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1b170 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1b180 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1b190 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1b1a0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1b1b0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1b1c0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1b1d0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1b1e0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1b1f0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1b200 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1b210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b220 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1b230 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1b240 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1b250 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1b260 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1b270 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1b280 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b290 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1b2a0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1b2b0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1b2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b2d0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1b2e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1b2f0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1b300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1b310 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1b320 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1b330 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1b340 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1b350 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1b360 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1b370 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b380 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1b390 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1b3a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b3b0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1b3c0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1b3d0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1b3e0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1b3f0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1b400 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1b410 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1b420 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1b430 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1b440 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1b450 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1b460 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1b470 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1b480 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1b490 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1b4a0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1b4b0 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1b4c0 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1b4d0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1b4e0 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
1b4f0 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
1b500 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
1b510 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
1b520 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
1b530 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1b540 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1b550 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
1b560 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1b570 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
1b580 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
1b590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1b5a0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b5b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
1b5c0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1b5d0 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
1b5e0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
1b5f0 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
1b600 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1b610 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1b620 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
1b630 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
1b640 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
1b650 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
1b660 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
1b670 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
1b680 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
1b690 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
1b6a0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65  **.  ** TODO: Te
1b6b0 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f  chnically the fo
1b6c0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72  llowing is an er
1b6d0 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61  ror because it a
1b6e0 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a  ssumes that.  **
1b6f0 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54   buffer Pager.pT
1b700 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61  mpSpace is (mxPa
1b710 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20  thname+1) bytes 
1b720 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20  or larger. i.e. 
1b730 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65  that.  ** (pPage
1b740 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70  r->pageSize >= p
1b750 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1b760 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e  athname+1). Usin
1b770 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a  g os_unix.c,.  *
1b780 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73  *  mxPathname is
1b790 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74   512, which is t
1b7a0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d  he same as the m
1b7b0 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  inimum allowable
1b7c0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20   value.  ** for 
1b7d0 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20  pageSize..  */. 
1b7e0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1b7f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1b800 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1b810 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1b820 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1b830 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1b840 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20  hname+1);.  if( 
1b850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b860 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
1b870 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b880 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
1b890 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
1b8a0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
1b8b0 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  s);.  }.  zMaste
1b8c0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1b8d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72  =SQLITE_OK || !r
1b8e0 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  es ){.    goto e
1b8f0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1b900 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1b910 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65  alOff = 0;.  nee
1b920 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73  dPagerReset = is
1b930 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  Hot;..  /* This 
1b940 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
1b950 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65  either when a re
1b960 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f  adJournalHdr() o
1b970 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  r .  ** pager_pl
1b980 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b990 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53  ) call returns S
1b9a0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
1b9b0 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20   IO error .  ** 
1b9c0 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20  occurs. .  */.  
1b9d0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1b9e0 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
1b9f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1ba00 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1ba10 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1ba20 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
1ba30 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
1ba40 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
1ba50 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
1ba60 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
1ba70 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
1ba80 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
1ba90 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65  rocess must have
1baa0 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
1bab0 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
1bac0 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
1bad0 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
1bae0 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
1baf0 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
1bb00 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
1bb10 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
1bb20 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
1bb30 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
1bb40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bb50 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
1bb60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1bb70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1bb80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1bb90 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1bba0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
1bbb0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1bbc0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1bbd0 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
1bbe0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1bbf0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
1bc00 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
1bc10 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
1bc20 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
1bc30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
1bc40 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
1bc50 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
1bc60 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1bc70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
1bc80 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
1bc90 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1bca0 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
1bcb0 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
1bcc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1bcd0 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
1bce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1bcf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1bd00 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1bd10 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1bd20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1bd30 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
1bd40 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
1bd50 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
1bd60 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
1bd70 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1bd80 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
1bd90 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
1bda0 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
1bdb0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
1bdc0 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
1bdd0 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
1bde0 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
1bdf0 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
1be00 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
1be10 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
1be20 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1be30 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
1be40 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
1be50 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
1be60 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
1be70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1be80 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
1be90 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
1bea0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1beb0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1bec0 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
1bed0 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
1bee0 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
1bef0 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
1bf00 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
1bf10 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
1bf20 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
1bf30 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1bf40 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
1bf50 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
1bf60 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
1bf70 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
1bf80 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
1bf90 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
1bfa0 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
1bfb0 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
1bfc0 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
1bfd0 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
1bfe0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
1bff0 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
1c000 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
1c010 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
1c020 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
1c030 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
1c040 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
1c050 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1c060 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
1c070 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
1c080 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
1c090 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
1c0a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1c0b0 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
1c0c0 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
1c0d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1c0e0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c0f0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1c100 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
1c110 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1c120 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
1c130 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
1c140 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1c150 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1c160 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1c170 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
1c180 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
1c190 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
1c1a0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1c1b0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
1c1c0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
1c1d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c1e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c1f0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1c200 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
1c210 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
1c220 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1c230 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
1c240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c250 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
1c260 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1c270 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1c280 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
1c290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c2a0 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
1c2b0 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
1c2c0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
1c2d0 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
1c2e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1c2f0 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65  nd/or page cache
1c300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1c310 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
1c320 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
1c330 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a  edPagerReset ){.
1c340 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1c350 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1c360 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65       needPagerRe
1c370 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  set = 0;.      }
1c380 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1c390 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1c3a0 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67  age(pPager,&pPag
1c3b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30  er->journalOff,0
1c3c0 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ,1,0);.      if(
1c3d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c3e0 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62  {.        nPlayb
1c3f0 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ack++;.      }el
1c400 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1c410 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
1c430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c440 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
1c450 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c460 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1c470 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1c480 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1c490 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1c4a0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72  rnal has been tr
1c4b0 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20  uncated, simply 
1c4c0 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64  stop reading and
1c4d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1c4e0 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75  ocessing the jou
1c4f0 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74  rnal. This might
1c500 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a   happen if the j
1c510 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20  ournal was.     
1c520 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70       ** not comp
1c530 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61  letely written a
1c540 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20  nd synced prior 
1c550 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20  to a crash.  In 
1c560 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1c570 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61  * case, the data
1c580 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65  base should have
1c590 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
1c5a0 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ten in the.     
1c5b0 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c       ** first pl
1c5c0 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20  ace so it is OK 
1c5d0 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f  to simply abando
1c5e0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  n the rollback. 
1c5f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1c600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c610 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c620 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c640 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1c650 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
1c660 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74  ck, quit and ret
1c670 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20  urn the error.  
1c680 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e          ** code.
1c690 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
1c6a0 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  e the pager to e
1c6b0 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
1c6c0 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  tate.          *
1c6d0 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72  * so that no fur
1c6e0 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62  ther harm will b
1c6f0 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73  e done.  Perhaps
1c700 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1c710 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74      ** process t
1c720 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c  o come along wil
1c730 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  l be able to rol
1c740 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61  lback the databa
1c750 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1c760 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c770 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
1c7a0 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
1c7b0 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
1c7c0 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f  layback:.  /* Fo
1c7d0 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1c7e0 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1c7f0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1c800 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1c810 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1c820 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1c830 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1c840 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1c850 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1c860 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1c870 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1c880 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1c890 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1c8a0 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1c8b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1c8c0 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1c8d0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c8e0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1c8f0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1c900 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  hods ){.    sqli
1c910 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1c920 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1c930 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c940 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20  UNCHANGED,0);.  
1c950 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1c960 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
1c970 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
1c980 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
1c990 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
1c9a0 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
1c9b0 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
1c9c0 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
1c9d0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
1c9e0 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
1c9f0 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
1ca00 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
1ca10 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
1ca20 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ca30 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
1ca40 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
1ca50 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
1ca60 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
1ca70 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
1ca80 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
1ca90 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
1caa0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
1cab0 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
1cac0 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
1cad0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1cae0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
1caf0 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
1cb00 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
1cb10 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
1cb20 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
1cb30 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
1cb40 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1cb50 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
1cb60 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
1cb70 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
1cb80 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
1cb90 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
1cba0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
1cbb0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1cbc0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1cbd0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
1cbe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cbf0 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
1cc00 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1cc10 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1cc20 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1cc30 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1cc40 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1cc50 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1cc60 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1cc70 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1cc80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cc90 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67  E_OK.   && (pPag
1cca0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1ccb0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1ccc0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1ccd0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
1cce0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ccf0 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61  te3PagerSync(pPa
1cd00 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ger, 0);.  }.  i
1cd10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cd20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1cd30 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1cd40 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
1cd50 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b  er[0]!='\0', 0);
1cd60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1cd70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1cd80 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1cd90 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1cda0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1cdb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1cdc0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1cdd0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1cde0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1cdf0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1ce00 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1ce10 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1ce20 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1ce30 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1ce40 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1ce50 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1ce60 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1ce70 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1ce80 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1ce90 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62   isHot && nPlayb
1cea0 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ack ){.    sqlit
1ceb0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
1cec0 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
1ced0 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65  LBACK, "recovere
1cee0 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20  d %d pages from 
1cef0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
1cf00 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20       nPlayback, 
1cf10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1cf20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
1cf30 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1cf40 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
1cf50 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
1cf60 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
1cf70 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
1cf80 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
1cf90 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
1cfa0 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
1cfb0 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
1cfc0 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
1cfd0 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1cfe0 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
1cff0 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
1d000 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1d010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1d020 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1d030 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
1d040 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1d050 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1d060 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
1d070 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
1d080 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
1d090 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
1d0a0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1d0b0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
1d0c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d0d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
1d0e0 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
1d0f0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
1d100 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1d110 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
1d120 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
1d130 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d140 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
1d150 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1d160 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
1d170 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1d180 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1d190 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
1d1a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d1b0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1d1c0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
1d1d0 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46  Hdr *pPg, u32 iF
1d1e0 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a  rame){.  Pager *
1d1f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1d200 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
1d210 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1d220 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
1d230 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
1d240 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
1d250 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1d260 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1d270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1d290 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1d2a0 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d  t pgsz = pPager-
1d2b0 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75  >pageSize; /* Nu
1d2c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1d2d0 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
1d2e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1d2f0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1d300 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1d310 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1d320 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23  Pager->fd) );..#
1d330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d340 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72  IT_WAL.  if( iFr
1d350 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ame ){.    /* Tr
1d360 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61  y to pull the pa
1d370 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74  ge from the writ
1d380 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a  e-ahead log. */.
1d390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d3a0 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61  WalReadFrame(pPa
1d3b0 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d  ger->pWal, iFram
1d3c0 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44  e, pgsz, pPg->pD
1d3d0 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  ata);.  }else.#e
1d3e0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34  ndif.  {.    i64
1d3f0 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
1d400 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1d410 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
1d420 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1d430 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
1d440 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20  g->pData, pgsz, 
1d450 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
1d460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1d470 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1d480 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d490 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1d4a0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
1d4b0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
1d4c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1d4d0 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
1d4e0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
1d4f0 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
1d500 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
1d510 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
1d520 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
1d530 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
1d540 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
1d550 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
1d560 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
1d570 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
1d580 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
1d590 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
1d5a0 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
1d5b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1d5c0 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
1d5d0 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
1d5e0 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
1d5f0 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
1d600 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
1d610 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
1d620 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
1d630 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
1d640 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
1d650 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
1d660 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
1d670 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1d680 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
1d690 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
1d6a0 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
1d6b0 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
1d6c0 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
1d6d0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d6e0 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
1d6f0 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
1d700 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
1d710 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
1d720 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79  e equaling 16 by
1d730 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76  tes of 0xff is v
1d740 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1d750 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   so.      ** we 
1d760 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
1d770 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ok..      */.   
1d780 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72     memset(pPager
1d790 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78  ->dbFileVers, 0x
1d7a0 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  ff, sizeof(pPage
1d7b0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1d7c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d7d0 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
1d7e0 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
1d7f0 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20  Data)[24];.     
1d800 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1d810 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1d820 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1d830 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d840 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rs));.    }.  }.
1d850 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1d860 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e   pPg->pData, pgn
1d870 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54  o, 3, rc = SQLIT
1d880 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47  E_NOMEM);..  PAG
1d890 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1d8a0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1d8b0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1d8c0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1d8d0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1d8e0 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1d8f0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50  ger, pgno));.  P
1d900 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43  AGERTRACE(("FETC
1d910 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1d920 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1d930 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1d940 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1d950 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1d960 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1d970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d980 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1d990 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1d9a0 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1d9b0 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1d9c0 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1d9d0 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1d9e0 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1d9f0 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1da00 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1da10 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1da20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1da30 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1da40 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1da50 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1da60 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1da70 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1da80 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1da90 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1daa0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1dab0 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1dac0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1dad0 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1dae0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1daf0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1db00 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1db10 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1db20 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1db30 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1db40 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1db50 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1db60 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1db70 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1db80 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1db90 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1dba0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1dbb0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1dbc0 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1dbd0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1dbe0 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1dbf0 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1dc00 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1dc10 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1dc20 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1dc30 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1dc40 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1dc50 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1dc60 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1dc70 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1dc80 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1dc90 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1dca0 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1dcb0 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1dcc0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1dcd0 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1dce0 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1dcf0 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1dd00 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1dd10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1dd20 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1dd30 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1dd40 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1dd50 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1dd60 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1dd70 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1dd80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1dd90 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1dda0 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1ddb0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1ddc0 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1ddd0 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1dde0 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1ddf0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1de00 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1de10 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1de20 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1de30 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1de40 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1de50 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1de60 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1de70 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1de80 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1de90 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1dea0 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1deb0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1dec0 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1ded0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1dee0 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1def0 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1df00 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1df10 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1df20 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1df30 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1df40 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1df50 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1df60 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1df70 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1df80 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1df90 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1dfa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1dfb0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1dfc0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1dfd0 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1dfe0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ;..  assert( pag
1dff0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1e000 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69   );.  pPg = sqli
1e010 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
1e020 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
1e030 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
1e040 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1e050 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
1e060 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1e070 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
1e080 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
1e090 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65        u32 iFrame
1e0a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1e0b0 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
1e0c0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1e0d0 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69  l, pPg->pgno, &i
1e0e0 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
1e0f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e100 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e110 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
1e120 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  iFrame);.      }
1e130 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1e140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e150 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1e160 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
1e170 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e180 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
1e190 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ll(pPg);.    }. 
1e1a0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1e1b0 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1e1c0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1e1d0 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1e1e0 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1e1f0 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1e200 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1e210 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1e220 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1e230 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1e240 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1e250 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1e260 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1e270 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1e280 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1e290 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1e2a0 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1e2b0 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1e2c0 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1e2d0 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1e2e0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1e2f0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1e300 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1e310 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1e320 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1e330 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1e340 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1e350 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1e360 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1e370 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1e380 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1e390 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1e3a0 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1e3b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e3c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e3d0 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1e3e0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1e3f0 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1e400 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1e410 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1e420 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1e430 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1e460 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1e470 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1e480 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1e490 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1e4a0 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1e4b0 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1e4c0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1e4d0 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1e4e0 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1e4f0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1e500 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1e510 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1e520 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1e530 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1e540 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1e550 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1e560 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1e570 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1e580 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1e590 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1e5a0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1e5b0 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1e5c0 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1e5d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1e5e0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1e5f0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1e600 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1e610 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1e620 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1e630 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1e640 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1e650 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1e660 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1e670 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1e680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e690 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1e6a0 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1e6b0 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1e6c0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1e6d0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1e6e0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1e6f0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1e700 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1e710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e720 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1e730 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1e740 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1e750 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1e760 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
1e770 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
1e780 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
1e790 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
1e7a0 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
1e7b0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1e7c0 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
1e7d0 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
1e7e0 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
1e7f0 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
1e800 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nged. .**.** The
1e810 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70   list of pages p
1e820 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20  assed into this 
1e830 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79  routine is alway
1e840 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65  s sorted by page
1e850 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63   number..** Henc
1e860 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70  e, if page 1 app
1e870 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e  ears anywhere on
1e880 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69   the list, it wi
1e890 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ll be the first 
1e8a0 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  page..*/ .static
1e8b0 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61   int pagerWalFra
1e8c0 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  mes(.  Pager *pP
1e8d0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
1e8e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e8f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64  object */.  PgHd
1e900 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  r *pList,       
1e910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1e920 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f  ist of frames to
1e930 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e   log */.  Pgno n
1e940 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1e950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1e960 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72  abase size after
1e970 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a   this commit */.
1e980 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1e9b0 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f  s is a commit */
1e9c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e9f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  code */.  int nL
1ea00 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1ea10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ea20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1ea30 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66  pList */.#if def
1ea40 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1ea50 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1ea60 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1ea70 29 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  ).  PgHdr *p;   
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1eaa0 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1eab0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1eac0 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  t( pPager->pWal 
1ead0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
1eae0 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  st );.#ifdef SQL
1eaf0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
1eb00 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70  erify that the p
1eb10 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61  age list is in a
1eb20 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
1eb30 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  /.  for(p=pList;
1eb40 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b   p && p->pDirty;
1eb50 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1eb60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67     assert( p->pg
1eb70 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e  no < p->pDirty->
1eb80 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  pgno );.  }.#end
1eb90 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  if..  assert( pL
1eba0 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c  ist->pDirty==0 |
1ebb0 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20  | isCommit );.  
1ebc0 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  if( isCommit ){.
1ebd0 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20      /* If a WAL 
1ebe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
1ebf0 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20  eing committed, 
1ec00 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
1ec10 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20  t in writing.   
1ec20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69   ** any pages wi
1ec30 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
1ec40 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72  greater than nTr
1ec50 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20  uncate into the 
1ec60 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  WAL file..    **
1ec70 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72   They will never
1ec80 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20   be read by any 
1ec90 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76  client. So remov
1eca0 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
1ecb0 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69  pDirty.    ** li
1ecc0 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  st here. */.    
1ecd0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67  PgHdr *p;.    Pg
1ece0 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26  Hdr **ppNext = &
1ecf0 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74  pList;.    nList
1ed00 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 0;.    for(p=
1ed10 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1ed20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44  = p)!=0; p=p->pD
1ed30 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28  irty){.      if(
1ed40 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63   p->pgno<=nTrunc
1ed50 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
1ed60 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1ed70 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73  ty;.        nLis
1ed80 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1ed90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1eda0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1edb0 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a  .    nList = 1;.
1edc0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53    }.  pPager->aS
1edd0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
1ede0 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a  RITE] += nList;.
1edf0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1ee00 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1ee10 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1ee20 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1ee30 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1ee40 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1ee50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1ee60 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1ee70 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1ee80 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c  mit, pPager->wal
1ee90 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20  SyncFlags.  );. 
1eea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eeb0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42  OK && pPager->pB
1eec0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48  ackup ){.    PgH
1eed0 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
1eee0 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1eef0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73  pDirty){.      s
1ef00 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1ef10 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1ef20 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38  up, p->pgno, (u8
1ef30 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20   *)p->pData);.  
1ef40 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
1ef50 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1ef60 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  ES.  pList = sql
1ef70 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1ef80 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1ef90 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  che);.  for(p=pL
1efa0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1efb0 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
1efc0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
1efd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1efe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1eff0 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
1f000 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f010 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
1f020 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
1f030 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
1f040 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
1f050 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
1f060 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
1f070 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
1f080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
1f090 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
1f0a0 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
1f0b0 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
1f0c0 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
1f0d0 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
1f0e0 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
1f0f0 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
1f100 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
1f110 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
1f120 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
1f130 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
1f140 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
1f150 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f160 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f190 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
1f1a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f1b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f1c0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
1f1d0 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
1f1e0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1f1f0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1f200 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1f210 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
1f220 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f230 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
1f240 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
1f250 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1f260 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
1f270 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
1f280 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
1f290 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
1f2a0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
1f2b0 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
1f2c0 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
1f2d0 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
1f2e0 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
1f2f0 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
1f300 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
1f310 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
1f320 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
1f330 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1f340 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1f350 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1f360 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
1f370 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
1f380 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1f390 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
1f3a0 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
1f3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
1f3c0 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
1f3d0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1f3e0 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
1f3f0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
1f400 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
1f410 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
1f420 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f430 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1f440 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f450 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
1f460 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
1f470 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
1f480 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
1f490 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
1f4a0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1f4b0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f4c0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
1f4d0 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
1f4e0 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
1f4f0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1f500 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
1f510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
1f520 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
1f530 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f540 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
1f550 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1f560 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
1f570 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
1f580 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
1f590 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
1f5a0 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
1f5b0 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
1f5c0 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
1f5d0 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
1f5e0 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
1f5f0 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
1f600 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1f610 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
1f620 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1f650 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1f660 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
1f670 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1f680 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
1f690 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
1f6a0 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
1f6b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1f6c0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
1f6d0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
1f6e0 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
1f6f0 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
1f700 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f710 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1f720 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1f730 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
1f740 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1f750 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f760 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
1f770 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
1f780 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
1f790 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
1f7a0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
1f7b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1f7c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f7d0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
1f7e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1f7f0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
1f800 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
1f810 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1f820 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
1f830 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1f840 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61  e size was not a
1f850 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1f860 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1f870 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ,.  ** determine
1f880 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65   it based on the
1f890 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f8a0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1f8b0 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  he size.  ** of 
1f8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f8d0 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  e is not an inte
1f8e0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
1f8f0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20  the page-size,. 
1f900 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74   ** round down t
1f910 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61  o the nearest pa
1f920 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20  ge. Except, any 
1f930 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  file larger than
1f940 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e   0.  ** bytes in
1f950 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65   size is conside
1f960 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  red to contain a
1f970 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
1f980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1f990 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  ge==0 ){.    i64
1f9a0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1f9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f9c0 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1f9d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73   bytes */.    as
1f9e0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1f9f0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1fa00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1fa10 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1fa20 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1fa30 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1fa40 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1fa50 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1fa60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fa70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fa80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fa90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1faa0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28  nPage = (Pgno)((
1fab0 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n+pPager->pageSi
1fac0 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e  ze-1) / pPager->
1fad0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
1fae0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1faf0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1fb00 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1fb10 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1fb20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
1fb30 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1fb40 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1fb50 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1fb60 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1fb70 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1fb80 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1fb90 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1fba0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1fbb0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1fbc0 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1fbd0 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
1fbe0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1fbf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1fc00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fc10 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
1fc20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1fc30 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
1fc40 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
1fc50 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
1fc60 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
1fc70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1fc80 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
1fc90 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
1fca0 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
1fcb0 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
1fcc0 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
1fcd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fce0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
1fcf0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1fd00 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
1fd10 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
1fd20 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
1fd30 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
1fd40 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
1fd50 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1fd60 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
1fd70 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1fd80 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
1fd90 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
1fda0 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
1fdb0 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
1fdc0 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
1fdd0 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
1fde0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1fdf0 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
1fe00 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
1fe10 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
1fe20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
1fe30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fe40 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
1fe50 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
1fe60 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
1fe70 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
1fe80 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
1fe90 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
1fea0 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
1feb0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1fec0 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
1fed0 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
1fee0 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
1fef0 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
1ff00 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
1ff10 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
1ff20 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
1ff30 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
1ff40 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1ff50 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
1ff60 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
1ff70 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1ff80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ff90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ffa0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1ffb0 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1ffc0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1ffd0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1ffe0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1fff0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20000 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20020 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
20030 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
20040 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20060 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
20070 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
20080 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
20090 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
200a0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
200b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
200c0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
200d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
200e0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
200f0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20100 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
20110 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20120 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
20130 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51  _NOENT ) rc = SQ
20140 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
20150 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
20160 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20170 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
20180 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
20190 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
201a0 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
201b0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
201c0 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
201d0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
201e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
201f0 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
20200 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20210 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
20220 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
20230 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
20240 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20250 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
20260 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20270 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
20280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
20290 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
202a0 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
202b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
202c0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
202d0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
202e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
202f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20300 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20310 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
20320 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
20330 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
20340 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
20350 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
20360 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
20370 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
20380 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
20390 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
203a0 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
203b0 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
203c0 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
203d0 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
203e0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
203f0 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
20400 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
20410 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
20420 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
20430 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20440 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
20450 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
20460 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
20470 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
20480 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
20490 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
204a0 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
204b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
204c0 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
204d0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
204e0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
204f0 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
20500 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
20510 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20520 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20530 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
20540 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20550 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
20560 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20570 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
20580 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
20590 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
205a0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
205b0 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
205c0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
205d0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
205e0 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
205f0 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
20600 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
20610 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
20620 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
20630 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
20640 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20650 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
20660 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20670 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
20680 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
20690 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
206a0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
206b0 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
206c0 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
206d0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
206e0 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
206f0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20700 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
20710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
20720 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
20730 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
20740 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
20750 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
20760 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
20770 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
20780 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
20790 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
207a0 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
207b0 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
207c0 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
207d0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
207e0 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
207f0 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
20800 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
20810 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
20820 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
20830 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
20840 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
20850 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
20860 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
20870 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20880 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
20890 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
208a0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
208b0 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
208c0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
208d0 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
208e0 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
208f0 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
20900 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
20910 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
20920 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
20930 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
20940 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
20950 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
20960 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
20970 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
20980 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
20990 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
209a0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
209b0 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
209c0 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
209d0 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
209e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
209f0 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
20a00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20a10 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
20a20 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
20a30 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
20a40 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
20a50 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20a60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
20a70 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
20a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20a90 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
20aa0 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
20ab0 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
20ac0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20ad0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
20ae0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
20af0 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
20b00 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
20b10 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
20b20 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
20b30 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
20b40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20b50 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
20b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20b70 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
20b80 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
20b90 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
20ba0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
20bb0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
20bc0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
20bd0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
20be0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
20bf0 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
20c00 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
20c10 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
20c20 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
20c30 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
20c40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
20c50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
20c60 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
20c70 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
20c80 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
20c90 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
20ca0 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
20cb0 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
20cc0 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
20cd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
20ce0 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
20cf0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
20d00 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
20d10 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  ze;.  pPager->ch
20d20 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
20d30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20d40 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
20d50 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
20d60 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
20d70 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
20d80 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
20d90 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
20da0 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
20db0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
20dc0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
20dd0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
20de0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
20df0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
20e00 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
20e10 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
20e20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20e30 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
20e40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20e50 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
20e60 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
20e70 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
20e80 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
20e90 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
20ea0 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
20eb0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
20ec0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
20ed0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
20ee0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
20ef0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
20f00 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
20f10 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
20f20 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
20f30 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
20f40 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
20f50 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20f60 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
20f70 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
20f80 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
20f90 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
20fa0 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
20fb0 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
20fc0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
20fd0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
20fe0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
20ff0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
21000 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
21010 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
21020 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
21030 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
21040 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
21050 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
21060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
21070 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
21080 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21090 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
210a0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
210b0 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
210c0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
210d0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
210e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
210f0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
21100 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
21110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21120 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21130 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
21140 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21150 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
21160 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
21170 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
21180 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
21190 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
211a0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
211b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
211c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
211d0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
211e0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
211f0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
21200 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
21210 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
21220 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
21230 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
21240 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
21250 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
21260 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
21270 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
21280 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
21290 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
212a0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
212b0 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
212c0 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
212d0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
212e0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
212f0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
21300 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
21310 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
21320 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
21330 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21340 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
21350 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
21360 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
21370 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
21380 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
21390 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
213a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
213b0 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
213c0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
213d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
213e0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
213f0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
21400 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
21410 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
21420 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
21430 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
21440 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
21450 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
21460 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
21470 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
21480 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
21490 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
214a0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
214b0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
214c0 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
214d0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
214e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
214f0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
21500 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
21510 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
21520 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
21530 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
21540 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
21550 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
21560 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
21570 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
21580 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
21590 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
215a0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
215b0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
215c0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
215d0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
215e0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
215f0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
21600 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21610 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21620 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
21630 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21640 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
21650 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
21660 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
21670 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
21680 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
21690 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
216a0 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
216b0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
216c0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
216d0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
216e0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
216f0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
21700 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
21710 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21720 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
21730 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21740 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
21750 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
21760 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21770 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
21780 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65  set = (i64)pSave
21790 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
217a0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
217b0 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  ze);..    if( pa
217c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
217d0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
217e0 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
217f0 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  intUndo(pPager->
21800 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74  pWal, pSavepoint
21810 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20  ->aWalData);.   
21820 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53   }.    for(ii=pS
21830 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21840 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
21850 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
21860 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
21870 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
21880 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b  set==(i64)ii*(4+
21890 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
218a0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
218b0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
218c0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
218d0 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
218e0 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
218f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21900 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
21910 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
21920 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
21930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21940 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
21950 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
21960 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
21970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21980 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
21990 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
219a0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
219b0 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
219c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
219d0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
219e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
219f0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
21a00 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
21a10 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
21a20 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
21a30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
21a40 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
21a50 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f  MAP_SIZE based o
21a60 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
21a70 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a  lue of szMmap..*
21a80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
21a90 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50  gerFixMaplimit(P
21aa0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
21ab0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
21ac0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69  AP_SIZE>0.  sqli
21ad0 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70  te3_file *fd = p
21ae0 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28  Pager->fd;.  if(
21af0 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66   isOpen(fd) && f
21b00 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
21b10 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20  rsion>=3 ){.    
21b20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
21b30 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65  ;.    sz = pPage
21b40 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70  r->szMmap;.    p
21b50 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68  Pager->bUseFetch
21b60 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73   = (sz>0);.    s
21b70 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
21b80 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
21b90 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
21ba0 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
21bb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
21bc0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21bd0 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
21be0 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70   any memory mapp
21bf0 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20  ing made of the 
21c00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21c10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21c20 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
21c30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
21c40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
21c50 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  map){.  pPager->
21c60 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
21c70 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  .  pagerFixMapli
21c80 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  mit(pPager);.}..
21c90 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
21ca0 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
21cb0 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
21cc0 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
21cd0 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
21ce0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21cf0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
21d00 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
21d10 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
21d20 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67  * Adjust setting
21d30 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74  s of the pager t
21d40 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
21d50 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73  d in the pgFlags
21d60 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
21d70 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e  * The "level" in
21d80 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
21d90 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
21da0 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73  K sets the robus
21db0 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tness.** of the 
21dc0 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
21dd0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
21de0 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61  shes or power fa
21df0 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61  ilures by.** cha
21e00 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
21e10 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
21e20 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  n writing the jo
21e30 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65  urnals..** There
21e40 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
21e50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
21e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
21e70 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
21e80 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
21e90 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
21eb0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
21ec0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
21ed0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
21ee0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
21ef0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
21f00 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
21f10 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
21f20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
21f30 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
21f40 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
21f50 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
21f70 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
21f80 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
21f90 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
21fa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21fb0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
21fc0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
21fd0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
21fe0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
21ff0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
22000 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
22010 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
22020 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
22040 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
22050 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
22060 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
22070 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
22080 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
22090 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
220a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
220b0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
220c0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
220d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
220e0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
220f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
22100 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
22110 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
22120 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
22130 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
22140 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
22150 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
22160 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
22170 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
22180 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
22190 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
221a0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
221b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
221c0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
221d0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
221e0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
221f0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
22200 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
22210 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
22220 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22230 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
22240 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
22250 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
22260 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
22270 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
22280 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
22290 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
222a0 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
222b0 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
222c0 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
222d0 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
222e0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
222f0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
22300 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
22310 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
22320 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
22330 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
22340 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
22350 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
22360 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
22370 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
22380 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
22390 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
223a0 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
223b0 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
223c0 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
223d0 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
223e0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
223f0 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
22400 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
22410 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
22420 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
22430 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
22440 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
22450 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
22460 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
22470 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
22480 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
22490 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
224a0 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
224b0 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
224c0 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
224d0 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
224e0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
224f0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
22500 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
22510 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
22520 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
22530 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
22540 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
22550 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
22560 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22570 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
22580 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
22590 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
225a0 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
225b0 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
225c0 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
225d0 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
225e0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
225f0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
22600 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
22610 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
22620 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
22630 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
22640 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
22650 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22660 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
22670 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
22680 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
22690 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
226a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
226b0 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
226c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
226d0 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
226e0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
226f0 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
22700 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
22710 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
22720 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
22730 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
22740 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
22750 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
22760 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22770 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74  S_MASK;.  assert
22780 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65  ( level>=1 && le
22790 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67  vel<=3 );.  pPag
227a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c  er->noSync =  (l
227b0 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
227c0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
227d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  0;.  pPager->ful
227e0 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d  lSync = (level==
227f0 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
22800 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
22810 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
22820 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
22830 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ->syncFlags = 0;
22840 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
22850 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  tSyncFlags = 0;.
22860 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22870 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c  ags & PAGER_FULL
22880 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
22890 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
228a0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
228b0 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
228c0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
228d0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
228e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
228f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50  lags & PAGER_CKP
22900 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  T_FULLFSYNC ){. 
22910 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22920 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22930 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
22940 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22950 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22960 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
22970 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
22980 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22990 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
229a0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
229b0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
229c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
229d0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
229e0 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
229f0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
22a00 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
22a10 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
22a20 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
22a30 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41   |= WAL_SYNC_TRA
22a40 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20  NSACTIONS;.  }. 
22a50 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
22a60 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20  AGER_CACHESPILL 
22a70 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
22a80 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
22a90 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
22aa0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22ab0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
22ac0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
22ad0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
22ae0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22af0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
22b00 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
22b10 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
22b20 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
22b30 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
22b40 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
22b50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
22b60 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
22b70 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
22b80 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
22b90 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
22ba0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
22bb0 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
22bc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
22bd0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
22be0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
22bf0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22c00 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
22c10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22c20 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
22c30 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
22c40 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
22c50 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
22c60 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
22c70 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
22c80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
22c90 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
22ca0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
22cb0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
22cc0 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
22cd0 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
22ce0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
22cf0 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
22d00 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
22d10 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
22d20 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
22d30 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
22d40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
22d50 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
22d60 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
22d70 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
22d80 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
22d90 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
22da0 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
22db0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22dc0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
22dd0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
22de0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22df0 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
22e00 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
22e10 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
22e20 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
22e30 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
22e40 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
22e50 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
22e60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
22e70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
22e80 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
22e90 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
22ea0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
22eb0 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
22ec0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
22ed0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
22ee0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
22ef0 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
22f00 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
22f10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
22f20 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
22f30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
22f40 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
22f50 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
22f60 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
22f70 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
22f80 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
22f90 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
22fa0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22fb0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
22fc0 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
22fd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22fe0 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
22ff0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
23000 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
23010 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
23020 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
23030 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
23040 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
23050 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
23060 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
23070 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
23080 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
23090 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
230a0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
230b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
230c0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
230d0 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
230e0 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
230f0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
23100 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
23110 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
23120 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
23130 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
23140 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
23150 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
23160 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
23170 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
23180 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
23190 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
231c0 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
231d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
231e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
231f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23200 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
23210 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
23220 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
23230 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
23240 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
23250 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
23260 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
23270 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
23280 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
23290 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
232a0 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
232b0 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
232c0 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
232d0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
232e0 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
232f0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
23300 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
23310 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
23320 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
23330 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
23340 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
23350 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
23360 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
23370 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23380 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
23390 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
233a0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
233b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
233c0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
233d0 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
233e0 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
233f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
23400 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
23410 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
23420 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
23430 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
23440 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
23450 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
23460 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20  Handler */.){.  
23470 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23480 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
23490 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
234a0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
234b0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
234c0 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
234d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
234e0 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28     void **ap = (
234f0 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d  void **)&pPager-
23500 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >xBusyHandler;. 
23510 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74     assert( ((int
23520 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b  (*)(void *))(ap[
23530 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c  0]))==xBusyHandl
23540 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  er );.    assert
23550 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61  ( ap[1]==pBusyHa
23560 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20  ndlerArg );.    
23570 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
23580 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
23590 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
235a0 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28  L_BUSYHANDLER, (
235b0 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a  void *)ap);.  }.
235c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
235d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
235e0 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
235f0 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
23600 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
23610 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
23620 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
23630 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
23640 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
23650 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
23660 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
23670 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
23680 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
23690 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
236a0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
236b0 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
236c0 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
236d0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
236e0 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20  xxx sub-code or 
236f0 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
23700 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
23710 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
23720 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
23730 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
23740 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
23750 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
23760 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
23770 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
23780 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
23790 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
237a0 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
237b0 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
237c0 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
237d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
237e0 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
237f0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
23800 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
23810 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
23820 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
23830 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
23840 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
23850 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
23860 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
23870 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
23880 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
23890 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
238a0 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
238b0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
238c0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
238d0 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
238e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
238f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
23900 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
23910 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
23920 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
23930 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
23940 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
23950 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
23960 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
23970 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
23980 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
23990 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
239a0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
239b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
239c0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
239d0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
239e0 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
239f0 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
23a00 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
23a10 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
23a20 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
23a30 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
23a40 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
23a50 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
23a60 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
23a70 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
23a80 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
23a90 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
23aa0 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
23ab0 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
23ac0 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
23ad0 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
23ae0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
23af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23b00 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
23b10 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20  er *pPager, u32 
23b20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
23b30 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
23b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23b50 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
23b60 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20   possible to do 
23b70 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61  a full assert_pa
23b80 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65  ger_state() here
23b90 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  , as this.  ** f
23ba0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
23bb0 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
23bc0 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62  n PagerOpen(), b
23bd0 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a  efore the state.
23be0 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65    ** of the Page
23bf0 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65  r object is inte
23c00 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e  rnally consisten
23c10 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20  t..  **.  ** At 
23c20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66  one point this f
23c30 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
23c40 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
23c50 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20   pager was in . 
23c60 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
23c70 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65  state. But since
23c80 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
23c90 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  te guarantees th
23ca0 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  at.  ** there is
23cb0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
23cc0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
23cd0 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66  eference, this f
23ce0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
23cf0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74  a no-op for that
23d00 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20   case anyhow..  
23d10 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69  */..  u32 pageSi
23d20 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
23d30 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
23d40 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
23d50 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
23d60 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
23d70 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
23d80 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
23d90 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
23da0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
23db0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
23dc0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
23dd0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
23de0 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
23df0 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70  pageSize!=(u32)p
23e00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
23e10 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
23e20 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pNew = NULL;    
23e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
23e40 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20  temp space */.  
23e50 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b    i64 nByte = 0;
23e60 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
23e70 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
23e80 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50  PEN && isOpen(pP
23e90 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
23ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23eb0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
23ec0 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  ->fd, &nByte);. 
23ed0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
23ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23ef0 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72      pNew = (char
23f00 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
23f10 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
23f20 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
23f30 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
23f40 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  MEM;.    }..    
23f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23f60 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
23f70 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
23f80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23f90 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
23fa0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
23fb0 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
23fc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23fe0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
23ff0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
24000 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
24010 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
24020 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
24030 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
24040 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
24050 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
24060 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
24070 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
24080 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  geSize;.    }els
24090 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
240a0 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  PageFree(pNew);.
240b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
240c0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
240d0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
240e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
240f0 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  ){.    if( nRese
24100 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
24110 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
24120 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
24130 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
24140 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
24150 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
24160 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
24170 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
24180 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
24190 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78  r);.    pagerFix
241a0 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
241b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
241c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
241d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
241e0 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
241f0 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
24200 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
24210 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
24220 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
24230 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
24240 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
24250 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
24260 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
24270 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
24280 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
24290 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
242a0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
242b0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
242c0 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
242d0 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
242e0 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
242f0 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
24300 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
24310 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
24320 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
24330 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
24340 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
24350 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24360 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
24370 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
24380 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
24390 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
243a0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
243b0 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
243c0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
243d0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
243e0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
243f0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
24400 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
24410 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
24420 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
24430 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
24440 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
24450 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
24460 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
24470 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
24480 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
24490 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
244a0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
244b0 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
244c0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
244d0 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
244e0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
244f0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
24500 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24510 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
24520 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
24530 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
24540 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
24550 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24560 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
24570 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
24580 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
24590 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
245a0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
245b0 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
245c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
245d0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
245e0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
245f0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
24600 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
24610 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
24620 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
24630 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
24640 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
24650 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
24660 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
24670 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
24680 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
24690 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
246a0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
246b0 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
246c0 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
246d0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
246e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
246f0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24700 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24710 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
24720 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24730 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
24740 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
24750 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
24760 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24770 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
24780 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
24790 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
247a0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
247b0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
247c0 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
247d0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
247e0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
247f0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24800 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
24810 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24820 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24830 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
24840 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
24850 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24860 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
24870 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
24880 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
24890 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
248a0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
248b0 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
248c0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
248d0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
248e0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
248f0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
24900 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
24910 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
24920 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
24930 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
24940 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
24950 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
24960 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
24970 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
24980 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
24990 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
249a0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
249b0 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
249c0 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
249d0 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
249e0 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
249f0 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
24a00 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
24a10 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
24a20 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
24a30 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
24a40 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
24a50 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
24a60 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
24a70 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
24a80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
24a90 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
24aa0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
24ab0 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
24ac0 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
24ad0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24ae0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
24af0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
24b00 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
24b10 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
24b20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24b30 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
24b40 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
24b50 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
24b60 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
24b70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24b80 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
24b90 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
24ba0 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
24bb0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
24bc0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
24bd0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
24be0 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
24bf0 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
24c00 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
24c10 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
24c20 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
24c30 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
24c40 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
24c50 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
24c60 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
24c70 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
24c80 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
24c90 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
24ca0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
24cb0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
24cc0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
24cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
24ce0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
24cf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24d00 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
24d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24d20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24d30 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
24d40 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
24d50 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
24d60 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
24d70 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
24d80 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
24d90 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
24da0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
24db0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
24dc0 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
24dd0 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
24de0 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
24df0 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
24e00 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
24e10 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
24e20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24e30 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
24e40 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24e50 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
24e60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24e70 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
24e80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
24e90 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
24ea0 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
24eb0 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
24ec0 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
24ed0 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
24ee0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
24ef0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
24f00 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
24f10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
24f20 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
24f30 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
24f40 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
24f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24f60 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
24f70 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
24f80 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
24f90 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
24fa0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
24fb0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
24fc0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
24fd0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
24fe0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
24ff0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
25000 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
25010 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
25020 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
25030 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
25040 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
25050 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
25060 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
25070 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
25080 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
25090 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
250a0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
250b0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
250c0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
250d0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
250e0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
250f0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
25100 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
25110 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
25120 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
25130 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
25140 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
25150 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
25160 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
25170 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
251a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
251b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
251c0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
251d0 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
251e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
251f0 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
25200 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e  ady held), or on
25210 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  e of the transit
25220 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
25230 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
25240 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
25250 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
25260 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
25270 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
25280 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
25290 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
252a0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
252b0 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
252c0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
252d0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
252e0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
252f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
25300 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
25310 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
25320 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
25330 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
25340 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
25350 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
25360 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
25370 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
25380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
25390 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
253a0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
253b0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
253c0 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
253d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
253e0 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
253f0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
25400 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
25410 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
25420 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
25430 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
25440 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
25450 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
25460 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
25470 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
25480 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
25490 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
254a0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
254b0 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
254c0 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
254d0 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
254e0 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
254f0 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
25500 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
25510 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
25520 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
25530 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
25540 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
25550 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
25560 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
25570 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
25580 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
25590 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
255a0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
255b0 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
255c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
255d0 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
255e0 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
255f0 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
25600 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
25610 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
25620 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
25630 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
25640 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
25650 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
25660 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
25670 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
25680 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
25690 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
256a0 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
256b0 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
256c0 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
256d0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
256e0 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  or would be to r
256f0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
25700 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
25710 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
25720 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
25730 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
25740 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
25750 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
25760 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
25770 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
25780 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
25790 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
257a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
257b0 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
257c0 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
257d0 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
257e0 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
257f0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
25800 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
25810 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
25820 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
25830 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
25840 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
25850 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
25860 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25870 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25880 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
25890 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
258a0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
258b0 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
258c0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
258d0 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
258e0 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
258f0 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
25900 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25910 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25920 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
25930 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
25940 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
25950 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25960 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25970 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
25980 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
25990 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
259a0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
259b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
259c0 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
259d0 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
259e0 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
259f0 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
25a00 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
25a10 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
25a20 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
25a30 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
25a40 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
25a50 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
25a60 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
25a70 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
25a80 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
25a90 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
25aa0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
25ab0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
25ac0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
25ad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25ae0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68  only called righ
25af0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
25b00 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
25b10 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  n..** Once this 
25b20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
25b30 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72  n called, the tr
25b40 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65  ansaction must e
25b50 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c  ither be.** roll
25b60 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ed back or commi
25b70 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  tted. It is not 
25b80 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  safe to call thi
25b90 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  s function and.*
25ba0 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  * then continue 
25bb0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
25bc0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
25bd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
25be0 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
25bf0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
25c00 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
25c10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
25c20 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
25c30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25c40 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
25c50 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
25c60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
25c70 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20  nPage;..  /* At 
25c80 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f  one point the co
25c90 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61  de here called a
25ca0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25cb0 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a  straint() to.  *
25cc0 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  * ensure that al
25cd0 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72  l pages being tr
25ce0 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20  uncated away by 
25cf0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
25d00 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  re,.  ** if one 
25d10 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
25d20 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65  ts are open, pre
25d30 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65  sent in the save
25d40 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72  point .  ** jour
25d50 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79  nal so that they
25d60 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
25d70 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   if the savepoin
25d80 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t is rolled.  **
25d90 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e   back. This is n
25da0 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61  o longer necessa
25db0 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  ry as this funct
25dc0 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a  ion is now only.
25dd0 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68    ** called righ
25de0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
25df0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
25e00 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74  n. So although t
25e10 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f  he .  ** Pager o
25e20 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20  bject may still 
25e30 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  have open savepo
25e40 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76  ints (Pager.nSav
25e50 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a  epoint!=0), .  *
25e60 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65  * they cannot be
25e70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f   rolled back. So
25e80 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63   the assertTrunc
25e90 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
25ea0 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  call.  ** is no 
25eb0 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20  longer correct. 
25ec0 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
25ed0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25ee0 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
25ef0 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
25f00 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
25f10 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
25f20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
25f30 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
25f40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25f50 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
25f60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
25f70 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
25f80 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
25f90 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
25fa0 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
25fb0 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
25fc0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
25fd0 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
25fe0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
25ff0 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
26000 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
26010 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
26020 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
26030 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
26040 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
26050 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
26060 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
26070 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
26080 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
26090 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
260a0 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
260b0 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
260c0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
260d0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
260e0 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
260f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
26100 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
26110 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
26120 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
26130 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
26140 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
26150 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
26160 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26170 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
26180 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
26190 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
261a0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
261b0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
261c0 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
261d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
261e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
261f0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
26200 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
26210 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
26220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26230 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
26240 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d  reference to a m
26250 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26260 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67  e object for pag
26270 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a  e number pgno. .
26280 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
26290 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70  t will use the p
262a0 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62  ointer pData, ob
262b0 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74  tained from xFet
262c0 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63  ch()..** If succ
262d0 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50  essful, set *ppP
262e0 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  age to point to 
262f0 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66  the new page ref
26300 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65  erence.** and re
26310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
26320 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
26330 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
26340 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a  r code and set.*
26350 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72  * *ppPage to zer
26360 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65  o..**.** Page re
26370 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65  ferences obtaine
26380 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  d by calling thi
26390 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
263a0 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a  d be released.**
263b0 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65   by calling page
263c0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
263d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
263e0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
263f0 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  Page(.  Pager *p
26400 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
26410 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
26420 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e   object */.  Pgn
26430 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26450 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Page number */. 
26460 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64   /* xFetch()'d d
26490 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67  ata for this pag
264a0 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70  e */.  PgHdr **p
264b0 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  pPage           
264c0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
264d0 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a  cquired page obj
264e0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  ect */.){.  PgHd
264f0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
26500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26510 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26520 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
26530 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e   .  if( pPager->
26540 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b  pMmapFreelist ){
26550 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
26560 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26570 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50  Freelist;.    pP
26580 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26590 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ist = p->pDirty;
265a0 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
265b0 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   0;.    memset(p
265c0 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
265d0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
265e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
265f0 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20  ge = p = (PgHdr 
26600 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
26610 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72  ero(sizeof(PgHdr
26620 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
26630 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ra);.    if( p==
26640 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26650 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26660 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
26670 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
26680 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
26690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
266a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
266b0 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
266c0 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
266d0 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
266e0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
266f0 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
26700 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
26710 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
26720 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
26730 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
26740 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26750 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
26760 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
26770 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
26780 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
26790 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
267a0 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
267b0 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
267c0 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
267d0 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
267e0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
267f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
26810 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
26820 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
26830 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
26840 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
26850 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
26860 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
26870 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
26880 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26890 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
268a0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
268b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
268c0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
268d0 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
268e0 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
268f0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26900 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
26910 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26920 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
26930 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
26940 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
26950 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
26960 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26970 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
26980 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
26990 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
269a0 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
269b0 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
269c0 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
269d0 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
269e0 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
269f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26a00 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
26a10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26a20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
26a30 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
26a40 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
26a50 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
26a60 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
26a70 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
26a80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26a90 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
26aa0 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
26ab0 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
26ac0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
26ad0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
26ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
26af0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
26b00 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
26b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
26b20 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
26b30 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
26b40 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
26b50 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
26b60 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
26b70 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
26b80 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
26b90 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
26ba0 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
26bb0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
26bc0 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
26bd0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
26be0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
26bf0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
26c00 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
26c10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26c20 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
26c30 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
26c40 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
26c50 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
26c60 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
26c70 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
26c80 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
26c90 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
26ca0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
26cb0 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
26cc0 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
26cd0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
26ce0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
26cf0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
26d00 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
26d10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26d20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
26d30 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
26d40 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
26d50 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
26d60 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
26d70 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
26d80 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
26d90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
26da0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
26db0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
26dc0 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
26dd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
26de0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
26df0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
26e00 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
26e10 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
26e20 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
26e30 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
26e40 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
26e50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26e60 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
26e70 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
26e80 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
26e90 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
26ea0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
26eb0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
26ec0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
26ed0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
26ee0 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
26ef0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
26f00 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
26f10 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
26f20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
26f30 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
26f40 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
26f50 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
26f60 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
26f70 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
26f80 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
26f90 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
26fa0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
26fb0 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
26fc0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
26fd0 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
26fe0 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
26ff0 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
27000 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
27010 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
27020 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
27030 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
27040 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
27050 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
27060 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
27070 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
27080 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
27090 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
270a0 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
270b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
270c0 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
270d0 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
270e0 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
270f0 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
27100 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
27110 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
27120 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
27130 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
27140 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
27150 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
27160 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
27170 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27180 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
27190 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
271a0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
271b0 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
271c0 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
271d0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
271e0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
271f0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
27200 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
27210 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
27220 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
27230 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
27240 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
27250 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
27260 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
27270 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
27280 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27290 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
272a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
272b0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
272c0 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
272d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
272e0 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
272f0 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
27300 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
27310 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
27320 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
27330 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
27340 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
27350 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
27360 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
27370 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
27380 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
27390 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
273a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
273b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
273c0 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
273d0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
273e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
273f0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
27400 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
27410 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
27420 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
27430 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
27440 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
27450 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
27460 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
27470 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
27480 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
27490 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
274a0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
274b0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
274c0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
274d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
274e0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
274f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27500 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27510 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27520 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
27530 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
27540 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
27550 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
27560 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
27570 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
27580 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
27590 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
275a0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
275b0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
275c0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
275d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
275e0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
275f0 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27600 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27620 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
27630 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
27640 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
27650 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
27660 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
27670 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
27680 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
27690 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
276a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
276b0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
276c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
276d0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
276e0 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
276f0 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
27700 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
27710 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27720 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
27730 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27740 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
27750 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
27760 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
27770 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
27780 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
27790 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
277a0 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
277b0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
277c0 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
277d0 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
277e0 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
277f0 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
27800 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
27810 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
27820 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
27830 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
27840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27850 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
27860 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
27870 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
27880 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
27890 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
278a0 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
278b0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
278c0 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
278d0 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
278e0 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
278f0 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
27900 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
27910 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
27920 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
27930 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27940 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27950 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
27960 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27970 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
27980 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
27990 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
279a0 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
279b0 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
279c0 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
279d0 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
279e0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
279f0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
27a00 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27a10 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
27a20 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
27a30 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
27a40 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27a50 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
27a60 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
27a70 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
27a80 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
27a90 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27aa0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
27ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
27ac0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
27ad0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
27ae0 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27b10 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
27b20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27b30 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27b40 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
27b50 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
27b60 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27b70 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
27b80 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
27b90 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
27ba0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27bb0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27bc0 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
27bd0 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
27be0 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
27bf0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27c00 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27c10 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
27c20 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
27c30 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27c40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
27c50 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27c60 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
27c70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27c80 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27c90 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
27ca0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
27cb0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
27cc0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
27cd0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
27ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27cf0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27d00 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
27d10 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
27d20 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
27d30 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
27d40 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
27d50 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
27d60 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
27d70 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
27d80 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
27d90 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
27da0 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
27db0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
27dc0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
27dd0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
27de0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27df0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
27e00 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
27e10 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
27e20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
27e30 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
27e40 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
27e50 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
27e60 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
27e70 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
27e80 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
27e90 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
27ea0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
27eb0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
27ec0 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
27ed0 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
27ee0 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
27ef0 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
27f00 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
27f10 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
27f20 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
27f30 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
27f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
27f50 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
27f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
27f70 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
27f80 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
27f90 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
27fa0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
27fb0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
27fc0 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
27fd0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
27fe0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27ff0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
28000 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
28010 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
28020 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
28030 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
28040 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
28050 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
28060 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
28070 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
28080 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
28090 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
280a0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
280b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
280c0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
280d0 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
280e0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
280f0 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
28100 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
28110 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
28120 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
28130 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
28140 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
28150 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
28160 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
28170 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
28180 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
28190 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
281a0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
281b0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
281c0 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
281d0 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
281e0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
281f0 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
28200 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
28210 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
28220 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
28230 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
28240 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
28250 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
28260 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
28270 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
28280 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
28290 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
282a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
282b0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
282c0 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
282d0 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
282e0 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
282f0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
28300 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
28310 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
28320 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
28330 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28340 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
28350 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
28360 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
28370 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
28380 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
28390 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
283a0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
283b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
283c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
283d0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
283e0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
283f0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28400 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28410 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
28420 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
28430 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
28440 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
28450 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
28460 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
28470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28480 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28490 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
284a0 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
284b0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
284c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
284d0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
284e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
284f0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28500 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28510 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28520 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
28530 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
28540 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28550 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
28560 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
28570 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
28580 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28590 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
285a0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
285b0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
285c0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
285d0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
285e0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
285f0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28600 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28610 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28620 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28630 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
28640 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
28650 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
28660 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
28670 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
28680 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
28690 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
286a0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
286b0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
286c0 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
286d0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
286e0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
286f0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
28700 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
28710 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
28720 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
28730 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
28740 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
28750 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
28760 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
28770 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
28780 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28790 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
287a0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
287b0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
287c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
287d0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
287e0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
287f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28800 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
28810 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28820 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28830 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28840 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28850 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28860 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
28870 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28880 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28890 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
288a0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
288b0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
288c0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
288d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
288e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
288f0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
28900 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28910 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
28920 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
28930 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28940 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28950 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28960 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28970 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28980 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
28990 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
289a0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
289b0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
289c0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
289d0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
289e0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
289f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
28a00 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
28a10 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
28a20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28a30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28a40 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
28a50 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
28a60 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
28a70 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
28a80 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
28a90 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
28aa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28ab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28ac0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28ad0 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
28ae0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
28af0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28b00 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
28b10 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
28b20 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
28b30 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
28b40 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
28b50 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
28b60 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
28b70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28b80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28b90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28bb0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
28bc0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28bd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28be0 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
28bf0 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
28c00 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
28c10 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
28c20 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
28c30 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
28c40 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
28c50 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
28c60 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
28c70 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
28c80 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
28c90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
28ca0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
28cb0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
28cc0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
28cd0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
28ce0 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
28cf0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
28d00 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
28d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28d20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
28d30 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
28d40 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
28d50 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
28d60 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
28d70 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
28d80 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
28d90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
28da0 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
28db0 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
28dc0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
28dd0 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
28de0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
28df0 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
28e00 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
28e10 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
28e20 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
28e30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28e40 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
28e50 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
28e60 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
28e70 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
28e80 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
28e90 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
28ea0 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
28eb0 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
28ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
28ed0 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
28ee0 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
28ef0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
28f00 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
28f10 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
28f20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
28f30 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
28f40 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
28f50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28f60 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
28f70 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
28f80 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
28f90 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
28fa0 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
28fb0 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
28fc0 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
28fd0 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
28fe0 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
28ff0 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
29000 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
29010 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
29020 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
29030 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
29040 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
29050 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
29060 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
29070 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
29080 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
29090 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
290a0 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
290b0 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
290c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
290d0 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
290e0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
290f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
29100 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
29110 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
29120 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
29130 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
29140 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
29150 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
29160 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
29170 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
29180 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
29190 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
291a0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
291b0 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
291c0 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
291d0 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
291e0 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
291f0 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
29200 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
29210 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
29220 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
29230 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
29240 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
29250 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
29260 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29270 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
29280 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
29290 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
292a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
292b0 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
292c0 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
292d0 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
292e0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
292f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29300 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
29310 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
29320 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
29330 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
29340 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29370 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
29380 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
29390 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
293a0 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
293b0 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
293c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
293d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
293e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
293f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29400 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
29410 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29420 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
29430 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
29440 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
29450 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
29460 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
29470 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
29480 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
29490 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
294a0 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
294b0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
294c0 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
294d0 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
294e0 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
294f0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
29500 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
29510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
29520 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29530 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29540 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29550 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
29560 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
29570 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
29580 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
29590 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
295a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
295b0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
295c0 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
295d0 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
295e0 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
295f0 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
29600 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
29610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29620 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
29630 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
29640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
29650 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69   && pPager->dbHi
29660 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  ntSize<pPager->d
29670 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69  bSize.   && (pLi
29680 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c  st->pDirty || pL
29690 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  ist->pgno>pPager
296a0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20  ->dbHintSize).  
296b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
296c0 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
296d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
296e0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
296f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
29700 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
29710 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
29720 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
29730 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
29740 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
29750 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29760 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
29770 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
29780 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29790 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
297a0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
297b0 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
297c0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
297d0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
297e0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
297f0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
29800 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
29810 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
29820 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
29830 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
29840 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
29850 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
29860 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
29870 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
29880 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
29890 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
298a0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
298b0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
298c0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
298d0 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
298e0 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
298f0 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
29900 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
29910 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
29920 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
29930 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
29940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29950 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
29960 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
29970 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
29980 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
29990 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
299a0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
299b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
299c0 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
299d0 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
299e0 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29a10 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
29a20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
29a30 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
29a40 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29a50 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
29a60 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
29a70 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
29a80 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
29a90 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
29aa0 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
29ab0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
29ac0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
29ad0 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
29ae0 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
29af0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
29b00 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
29b10 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
29b20 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
29b30 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29b40 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
29b50 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
29b60 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
29b70 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
29b80 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
29b90 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
29ba0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
29bb0 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
29bc0 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
29bd0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
29be0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
29bf0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
29c00 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
29c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29c20 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
29c30 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
29c40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29c50 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
29c60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
29c70 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
29c80 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
29c90 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
29ca0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
29cb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
29cc0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
29cd0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
29ce0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29cf0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
29d00 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
29d10 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
29d20 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
29d30 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
29d40 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
29d50 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
29d60 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
29d70 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
29d80 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
29d90 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
29da0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
29db0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
29dc0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29dd0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
29de0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e00 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29e10 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
29e20 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
29e30 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
29e40 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
29e50 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
29e60 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
29e70 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
29e80 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
29e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29ea0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29eb0 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
29ec0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29ed0 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
29ee0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
29ef0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
29f00 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
29f10 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
29f20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
29f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
29f40 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
29f50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
29f60 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
29f70 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
29f80 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
29f90 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
29fa0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29fb0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
29fc0 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
29fd0 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
29fe0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
29ff0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
2a000 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2a010 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2a020 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
2a030 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2a040 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2a050 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2a060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a070 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
2a080 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a090 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
2a0a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2a0b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2a0c0 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
2a0d0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
2a0e0 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
2a0f0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
2a100 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
2a110 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a120 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2a130 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
2a140 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
2a150 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2a160 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
2a170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a180 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
2a190 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
2a1a0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
2a1b0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
2a1c0 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
2a1d0 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
2a1e0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
2a1f0 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
2a200 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
2a210 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
2a220 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
2a230 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
2a240 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2a250 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2a260 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2a270 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2a280 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2a290 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2a2a0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2a2b0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2a2c0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2a2d0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a2e0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2a2f0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2a300 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2a310 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2a320 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2a330 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2a340 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2a350 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2a360 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2a370 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2a380 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2a390 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2a3a0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2a3b0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2a3c0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2a3d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a3e0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2a3f0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2a400 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2a410 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2a420 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a430 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2a440 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2a450 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2a460 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2a470 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2a480 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2a490 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2a4a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a4b0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2a4c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a4d0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2a4e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a4f0 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2a500 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2a510 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2a520 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2a530 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2a540 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2a550 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2a560 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2a570 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2a580 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2a590 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2a5a0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2a5b0 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2a5c0 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2a5d0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2a5e0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2a5f0 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2a600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2a610 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2a620 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2a630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a640 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2a650 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2a660 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2a670 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2a680 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2a690 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2a6a0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2a6b0 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2a6c0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2a6d0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2a6e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a6f0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
2a700 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a710 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
2a720 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2a730 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2a740 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a750 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2a760 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
2a770 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
2a780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a7a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a7b0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a7c0 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
2a7d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a7e0 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
2a7f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a800 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a810 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
2a820 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
2a830 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a840 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
2a850 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
2a860 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2a870 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2a880 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2a890 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2a8a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2a8b0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2a8c0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2a8d0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2a8e0 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2a8f0 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2a900 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2a910 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2a920 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2a930 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2a940 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2a950 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2a960 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2a970 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2a980 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2a990 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2a9a0 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2a9b0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2a9c0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2a9d0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2a9e0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2a9f0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2aa00 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2aa10 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2aa20 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2aa30 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2aa40 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2aa50 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2aa60 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2aa70 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2aa80 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2aa90 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2aaa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2aab0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2aac0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2aad0 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2aae0 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2aaf0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2ab00 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2ab10 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2ab20 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2ab30 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2ab40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2ab50 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2ab60 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2ab70 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2ab80 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2ab90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2aba0 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2abb0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2abc0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2abd0 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2abe0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2abf0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2ac00 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2ac10 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2ac20 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2ac30 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2ac40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2ac50 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2ac60 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2ac70 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2ac80 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2ac90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2aca0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2acb0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2acc0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2acd0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ace0 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2acf0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2ad00 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2ad10 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2ad20 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2ad30 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2ad40 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2ad50 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2ad60 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2ad70 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2ad80 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2ad90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2ada0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2adb0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2adc0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2add0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2ade0 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2adf0 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2ae00 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2ae10 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2ae20 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2ae30 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2ae40 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2ae50 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2ae60 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2ae70 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2ae80 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2ae90 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2aea0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2aeb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2aec0 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2aed0 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2aee0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2aef0 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2af00 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2af10 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2af20 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2af30 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2af40 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2af50 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2af60 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2af70 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2af80 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2af90 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2afa0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2afb0 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2afc0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2afd0 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2afe0 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2aff0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2b000 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2b010 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2b020 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2b030 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2b040 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2b050 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2b060 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2b070 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2b080 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2b090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2b0a0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b0b0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b0c0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2b0d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b0e0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b0f0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2b100 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2b110 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b120 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b130 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2b140 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b150 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2b160 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b170 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2b180 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2b190 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2b1a0 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2b1b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2b1c0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2b1d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b1e0 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
2b1f0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
2b200 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2b210 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
2b220 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2b230 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2b240 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2b250 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2b260 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
2b270 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
2b280 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
2b290 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b2a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b2b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2b2c0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2b2d0 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2b2e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20   }.  }else{.  . 
2b2f0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2b300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2b310 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2b320 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2b330 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2b340 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2b350 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2b360 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2b370 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2b380 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2b390 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2b3a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
2b3b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2b3c0 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
2b3d0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
2b3e0 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a  nt size of.    *
2b3f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
2b400 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65  mage, it may nee
2b410 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  d to be written 
2b420 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2b430 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  al..    ** This 
2b440 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
2b450 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
2b460 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
2b470 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
2b480 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
2b490 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
2b4a0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
2b4b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b4c0 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
2b4d0 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
2b4e0 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a  of events:.    *
2b4f0 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e  *.    **   BEGIN
2b500 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  ;.    **     <jo
2b510 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
2b520 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79    **     <modify
2b530 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
2b540 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
2b550 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c  ;.    **       <
2b560 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
2b570 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
2b580 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61  .    **       pa
2b590 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
2b5a0 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c  ).    **     ROL
2b5b0 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
2b5c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58   **.    ** If (X
2b5d0 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
2b5e0 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
2b5f0 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
2b600 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
2b610 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68      ** out to th
2b620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2b630 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
2b640 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
2b650 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a  che. Then,.    *
2b660 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
2b670 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
2b680 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64   statement, read
2b690 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20  ing page X will 
2b6a0 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61  read.    ** data
2b6b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2b6c0 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
2b6d0 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
2b6e0 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
2b6f0 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74     ** was when t
2b700 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
2b710 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
2b720 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
2b730 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a  POINT sp".    **
2b740 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
2b750 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2b760 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
2b770 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
2b780 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  t data for page 
2b790 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  X into the .    
2b7a0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
2b7b0 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
2b7c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
2b7d0 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
2b7e0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2b7f0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
2b800 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
2b810 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
2b820 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20   TO sp" is .    
2b830 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  ** executed..   
2b840 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
2b850 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  R(.        rc==S
2b860 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
2b870 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2b880 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
2b890 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
2b8a0 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20    ) ){.      rc 
2b8b0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2b8c0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  (pPg);.    }.  .
2b8d0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2b8e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2b8f0 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
2b900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2b910 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2b920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b930 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
2b940 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2b950 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
2b960 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
2b970 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
2b980 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d  ger, pPg);.    }
2b990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
2b9a0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2b9b0 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
2b9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b9d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2b9e0 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
2b9f0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2ba00 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2ba10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
2ba20 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
2ba30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2ba40 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2ba50 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f  ger, rc); .}.../
2ba60 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
2ba70 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
2ba80 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
2ba90 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
2baa0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
2bab0 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
2bac0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
2bad0 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
2bae0 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
2baf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2bb00 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
2bb10 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
2bb20 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
2bb30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2bb40 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
2bb50 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2bb60 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
2bb70 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
2bb80 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
2bb90 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
2bba0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
2bbb0 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
2bbc0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
2bbd0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
2bbe0 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
2bbf0 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
2bc00 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2bc10 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
2bc20 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
2bc30 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
2bc40 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
2bc50 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
2bc60 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
2bc70 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
2bc80 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
2bc90 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
2bca0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2bcb0 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2bcc0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2bcd0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2bce0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2bcf0 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2bd00 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2bd10 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2bd20 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2bd30 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2bd40 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2bd50 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
2bd60 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2bd70 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
2bd80 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
2bd90 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
2bda0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
2bdb0 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
2bdc0 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
2bdd0 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
2bde0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
2bdf0 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a  PAGER_* flags..*
2be00 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
2be10 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
2be20 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
2be30 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
2be40 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
2be50 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
2be60 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
2be70 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
2be80 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
2be90 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
2bea0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
2beb0 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
2bec0 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
2bed0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
2bee0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2bef0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
2bf00 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
2bf10 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
2bf20 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
2bf30 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2bf40 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
2bf50 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
2bf60 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
2bf70 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
2bf80 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2bf90 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
2bfa0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
2bfb0 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
2bfc0 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
2bfd0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
2bfe0 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
2bff0 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
2c000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2c010 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
2c020 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2c030 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2c040 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
2c050 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
2c060 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
2c070 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
2c080 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
2c090 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2c0a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2c0b0 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
2c0c0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2c0d0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
2c0e0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c100 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
2c110 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
2c120 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2c130 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2c140 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2c150 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
2c160 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
2c170 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
2c180 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
2c190 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
2c1a0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
2c1b0 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
2c1c0 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
2c1d0 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
2c1e0 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
2c1f0 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
2c200 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
2c210 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
2c220 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2c230 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
2c240 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
2c250 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c260 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
2c270 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
2c280 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
2c290 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2c2a0 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
2c2b0 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
2c2c0 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
2c2d0 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2c2e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c2f0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2c300 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
2c310 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
2c320 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c330 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
2c340 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
2c350 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c360 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
2c370 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
2c380 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
2c390 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
2c3a0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
2c3b0 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
2c3c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2c3d0 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
2c3e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
2c3f0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2c400 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
2c410 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
2c420 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
2c430 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
2c440 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
2c450 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
2c460 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
2c470 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2c480 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
2c490 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2c4a0 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
2c4b0 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  32 szPageDflt = 
2c4c0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2c4d0 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
2c4e0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2c4f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2c500 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a  *zUri = 0;    /*
2c510 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70   URI args to cop
2c520 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20  y */.  int nUri 
2c530 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2c540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2c550 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61  es of URI args a
2c560 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a  t *zUri */..  /*
2c570 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
2c580 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
2c590 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
2c5a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2c5b0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
2c5c0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
2c5d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
2c5e0 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
2c5f0 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
2c600 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
2c610 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
2c620 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2c630 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2c640 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
2c650 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
2c660 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
2c670 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
2c680 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
2c690 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
2c6a0 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
2c6b0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
2c6c0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
2c6d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
2c6e0 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
2c6f0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2c700 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2c710 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
2c720 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
2c730 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
2c740 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
2c750 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c760 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
2c770 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
2c780 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c790 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c7a0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2c7b0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
2c7c0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2c7d0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2c7e0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2c7f0 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
2c800 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2c810 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2c820 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2c830 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2c840 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2c850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c860 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2c870 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2c880 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2c890 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2c8a0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2c8b0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2c8c0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2c8d0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2c8e0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2c8f0 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2c900 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2c910 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c920 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2c930 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2c940 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2c950 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2c960 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2c970 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2c980 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2c990 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2c9a0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2c9b0 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2c9c0 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2c9d0 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2c9e0 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2c9f0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2ca00 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2ca10 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2ca20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2ca30 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2ca40 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2ca50 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2ca60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2ca70 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2ca80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2ca90 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2caa0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2cab0 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2cac0 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2cad0 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2cae0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2caf0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2cb00 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
2cb10 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
2cb20 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
2cb30 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
2cb40 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
2cb50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2cb60 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
2cb70 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
2cb80 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
2cb90 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e  ame);.    nPathn
2cba0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2cbb0 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2cbc0 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d  ;.    z = zUri =
2cbd0 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69   &zFilename[sqli
2cbe0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
2cbf0 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77  ename)+1];.    w
2cc00 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
2cc10 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2cc20 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2cc30 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2cc40 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2cc50 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28    }.    nUri = (
2cc60 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72  int)(&z[1] - zUr
2cc70 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i);.    assert( 
2cc80 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nUri>=0 );.    i
2cc90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cca0 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
2ccb0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ccc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2ccd0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2cce0 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
2ccf0 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
2cd00 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
2cd10 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
2cd20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
2cd30 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
2cd40 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
2cd50 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
2cd60 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
2cd70 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
2cd80 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
2cd90 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
2cda0 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
2cdb0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
2cdc0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
2cdd0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
2cde0 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
2cdf0 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
2ce00 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
2ce10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2ce20 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2ce30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2ce40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ce50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2ce60 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2ce70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ce80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2ce90 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
2cea0 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
2ceb0 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
2cec0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
2ced0 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
2cee0 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
2cef0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2cf00 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
2cf10 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
2cf20 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
2cf30 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
2cf40 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
2cf50 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf70 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
2cf80 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
2cf90 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
2cfc0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
2cfd0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2cfe0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2cff0 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
2d000 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
2d010 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
2d020 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d030 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2d040 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2d050 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
2d060 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2d070 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
2d080 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2d090 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2d0a0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
2d0b0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2d0c0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
2d0d0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
2d0e0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2d0f0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2d100 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
2d110 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
2d120 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2d130 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
2d140 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
2d150 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
2d160 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
2d170 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2d180 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
2d190 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
2d1a0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2d1b0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
2d1c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2d1d0 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
2d1e0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2d1f0 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
2d200 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
2d210 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
2d220 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
2d230 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20  + nUri +        
2d240 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
2d250 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d260 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   8 + 2          
2d270 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
2d280 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2d290 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b  E_OMIT_WAL.    +
2d2a0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b   nPathname + 4 +
2d2b0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   2            /*
2d2c0 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   zWal */.#endif.
2d2d0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
2d2e0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2d2f0 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
2d300 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
2d310 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
2d320 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
2d330 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2d340 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
2d350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d360 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
2d370 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2d380 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
2d390 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
2d3a0 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
2d3b0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d3c0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2d3d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
2d3e0 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
2d3f0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d400 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
2d410 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
2d420 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
2d430 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d440 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2d450 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
2d460 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
2d470 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
2d480 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2d490 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d4a0 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
2d4b0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2d4c0 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
2d4d0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2d4e0 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
2d4f0 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
2d500 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
2d510 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
2d520 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
2d530 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
2d540 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
2d550 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  hname ){.    ass
2d560 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30  ert( nPathname>0
2d570 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2d580 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2d590 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2d5a0 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2d5b0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2d5c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d5d0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d5e0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
2d5f0 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26   nUri ) memcpy(&
2d600 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d610 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20  e[nPathname+1], 
2d620 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
2d630 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d640 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
2d650 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2d660 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2d670 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2d680 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
2d690 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a  nal\000", 8+2);.
2d6a0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d6b0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d6c0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d6d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66  ->zJournal);.#if
2d6e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d6f0 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d  _WAL.    pPager-
2d700 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
2d710 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2d720 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65  ame+8+1];.    me
2d730 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2d740 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2d750 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2d760 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2d770 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2d780 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b  -wal\000", 4+1);
2d790 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2d7a0 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2d7b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d7c0 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66  r->zWal);.#endif
2d7d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2d7e0 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2d7f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
2d800 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2d810 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
2d820 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
2d830 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
2d840 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2d850 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2d860 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2d870 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d890 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
2d8a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
2d8b0 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
2d8c0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2d8d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
2d8e0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d8f0 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
2d900 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  out);.    assert
2d910 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20  ( !memDb );.    
2d920 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
2d930 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2d940 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  DONLY);..    /* 
2d950 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
2d960 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
2d970 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
2d980 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a  te access,.    *
2d990 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
2d9a0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
2d9b0 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
2d9c0 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a  create the.    *
2d9d0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
2d9e0 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
2d9f0 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
2da00 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a  ximum of:.    **
2da10 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c  .    **    + SQL
2da20 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2da30 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20  _SIZE,.    **   
2da40 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
2da50 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2da60 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
2da70 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c     **    + The l
2da80 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65  argest page size
2da90 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69   that can be wri
2daa0 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tten atomically.
2dab0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2dad0 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d  .      int iDc =
2dae0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2daf0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2db00 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2db10 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79     if( !readOnly
2db20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53   ){.        setS
2db30 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2db40 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2db50 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2db60 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2db70 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2db80 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2db90 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2dba0 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2dbb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2dbc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2dbd0 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2dbe0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2dbf0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2dc00 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2dc10 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
2dc20 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
2dc30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2dc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2dc50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70  ageDflt = (u32)p
2dc60 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2dc70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2dc80 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
2dc90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2dca0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2dcb0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
2dcc0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
2dcd0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2dce0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
2dcf0 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
2dd00 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2dd10 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2dd20 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2dd30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2dd40 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
2dd50 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2dd60 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
2dd70 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
2dd80 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
2dd90 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2dda0 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ddc0 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2ddd0 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2dde0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2ddf0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2de00 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ii;.           
2de10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2de20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2de30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2de40 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73  ager->noLock = s
2de50 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2de60 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e  an(zFilename, "n
2de70 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20  olock", 0);.    
2de80 20 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c    if( (iDc & SQL
2de90 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41  ITE_IOCAP_IMMUTA
2dea0 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  BLE)!=0.       |
2deb0 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  | sqlite3_uri_bo
2dec0 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2ded0 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29   "immutable", 0)
2dee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66   ){.          vf
2def0 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2df00 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2df10 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
2df20 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c  ct_like_temp_fil
2df30 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2df40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2df50 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
2df60 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
2df70 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
2df80 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
2df90 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
2dfa0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
2dfb0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2dfc0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
2dfd0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
2dfe0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
2dff0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
2e000 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
2e010 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2e020 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2e030 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
2e040 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2e050 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
2e060 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2e070 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2e080 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
2e090 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2e0a0 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
2e0b0 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
2e0c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
2e0d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
2e0e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2e0f0 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73  branch also runs
2e100 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65   for files marke
2e110 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a  d as immutable..
2e120 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65      */ .act_like
2e130 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20  _temp_file:.    
2e140 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2e150 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2e160 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2e170 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20       /* Pretend 
2e180 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
2e190 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50  a lock */.    pP
2e1a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58  ager->eLock = EX
2e1b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20  CLUSIVE_LOCK;   
2e1c0 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2e1d0 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  re in EXCLUSIVE 
2e1e0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a  locking mode */.
2e1f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2e200 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ck = 1;         
2e210 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20         /* Do no 
2e220 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72  locking */.    r
2e230 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2e240 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2e250 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2e260 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2e270 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2e280 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2e290 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2e2a0 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2e2b0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2e2c0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2e2d0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2e2e0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2e2f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e300 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2e310 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2e320 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2e330 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2e340 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2e350 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2e360 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2e370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2e380 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
2e390 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
2e3a0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
2e3b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e3c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  {.    assert( nE
2e3d0 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20  xtra<1000 );.   
2e3e0 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2e3f0 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63  (nExtra);.    rc
2e400 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2e410 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2e420 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2e430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e440 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2e450 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2e460 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2e470 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2e480 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
2e490 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2e4a0 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ed above, free t
2e4b0 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74  he  Pager struct
2e4c0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2e4d0 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2e4e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e4f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
2e500 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2e510 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  d);.    sqlite3P
2e520 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
2e530 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
2e540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2e550 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
2e560 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
2e570 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2e580 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2e590 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2e5a0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e5b0 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2e5c0 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2e5d0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2e5e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2e5f0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2e600 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2e610 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2e620 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2e630 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e640 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2e650 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e660 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2e670 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2e680 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2e690 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2e6a0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e6b0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2e6c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2e6d0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2e6e0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2e6f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2e700 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2e710 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e720 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
2e730 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
2e740 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
2e750 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
2e760 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2e770 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2e780 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
2e790 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2e7a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2e7b0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2e7c0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2e7d0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
2e7e0 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
2e7f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
2e800 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
2e810 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2e820 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
2e830 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2e840 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
2e850 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
2e860 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
2e870 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73  8)readOnly;.  as
2e880 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
2e890 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
2e8a0 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
2e8b0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
2e8c0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
2e8d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2e8e0 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
2e8f0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2e900 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2e910 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
2e920 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2e930 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e940 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
2e950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e960 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2e970 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  lags==0 );.  }el
2e980 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
2e990 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20  fullSync = 1;.  
2e9a0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2e9b0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2e9c0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
2e9d0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2e9e0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2e9f0 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59  _NORMAL | WAL_SY
2ea00 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
2ea10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
2ea20 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
2ea30 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2ea40 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2ea50 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
2ea60 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2ea70 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
2ea80 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ea90 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
2eaa0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
2eab0 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
2eac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2ead0 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
2eae0 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
2eaf0 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
2eb00 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2eb10 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
2eb20 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
2eb30 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2eb40 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
2eb50 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
2eb60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2eb70 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2eb80 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
2eb90 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
2eba0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2ebb0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2ebc0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2ebd0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2ebe0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
2ebf0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ec00 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
2ec10 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
2ec20 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
2ec30 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
2ec40 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
2ec50 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
2ec60 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
2ec70 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ec80 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54  ->szMmap = SQLIT
2ec90 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53  E_DEFAULT_MMAP_S
2eca0 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73  IZE // will be s
2ecb0 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f  et by btree.c */
2ecc0 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
2ecd0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
2ece0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2ecf0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
2ed00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ed10 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74  has not be delet
2ed20 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75  ed or renamed ou
2ed30 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20  t from.** under 
2ed40 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75  the pager.  Retu
2ed50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2ed60 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2ed70 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75  still were it ou
2ed80 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20  ght.** to be on 
2ed90 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f  disk.  Return no
2eda0 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52  n-zero (SQLITE_R
2edb0 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20  EADONLY_DBMOVED 
2edc0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
2edd0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d  ror.** code from
2ede0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2edf0 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62  ()) if the datab
2ee00 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73  ase has gone mis
2ee10 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2ee20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e  int databaseIsUn
2ee30 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61  moved(Pager *pPa
2ee40 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73  ger){.  int bHas
2ee50 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74  Moved = 0;.  int
2ee60 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
2ee70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72  er->tempFile ) r
2ee80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ee90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2eea0 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72  bSize==0 ) retur
2eeb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
2eec0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a  ssert( pPager->z
2eed0 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67  Filename && pPag
2eee0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
2eef0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2ef00 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
2ef10 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
2ef20 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56  TE_FCNTL_HAS_MOV
2ef30 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b  ED, &bHasMoved);
2ef40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ef50 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
2ef60 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f    /* If the HAS_
2ef70 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  MOVED file-contr
2ef80 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e  ol is unimplemen
2ef90 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ted, assume that
2efa0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
2efb0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f   has not been mo
2efc0 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68  ved.  That is th
2efd0 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68  e historical beh
2efe0 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a  avior of SQLite:
2eff0 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a   prior to.    **
2f000 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20   version 3.8.3, 
2f010 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64  it never checked
2f020 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
2f030 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
2f040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f050 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29  K && bHasMoved )
2f060 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2f070 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2f080 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ED;.  }.  return
2f090 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2f0a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f0b0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
2f0c0 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
2f0d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
2f0e0 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
2f0f0 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
2f100 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
2f110 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
2f120 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
2f130 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2f140 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
2f150 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
2f160 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
2f170 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2f180 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
2f190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2f1a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
2f1b0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
2f1c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2f1d0 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
2f1e0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
2f1f0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f200 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
2f210 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
2f220 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
2f230 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
2f240 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2f250 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f260 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2f270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f280 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
2f290 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
2f2a0 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
2f2b0 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
2f2c0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2f2d0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2f2e0 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
2f2f0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
2f300 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
2f310 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2f320 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
2f330 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
2f340 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
2f350 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
2f360 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
2f370 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
2f380 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
2f390 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
2f3a0 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
2f3b0 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
2f3c0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
2f3d0 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
2f3e0 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
2f3f0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2f400 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2f410 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
2f420 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
2f430 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
2f440 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
2f450 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
2f460 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
2f470 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
2f480 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
2f490 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
2f4a0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
2f4b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f4c0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2f4d0 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
2f4e0 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
2f4f0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
2f500 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
2f510 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
2f520 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
2f530 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
2f540 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
2f550 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2f560 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
2f570 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
2f580 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
2f590 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2f5a0 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
2f5b0 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
2f5c0 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
2f5d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f5e0 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
2f5f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2f600 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
2f610 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
2f620 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2f630 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2f640 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2f650 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
2f660 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
2f670 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
2f680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2f690 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
2f6a0 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
2f6b0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2f6c0 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
2f6d0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
2f6e0 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
2f6f0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
2f700 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
2f710 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
2f720 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2f730 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2f740 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
2f750 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2f760 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2f770 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
2f780 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
2f790 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f7a0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
2f7b0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
2f7c0 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
2f7d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f7e0 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
2f7f0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2f800 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
2f810 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2f820 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
2f830 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2f840 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
2f850 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
2f860 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
2f870 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2f880 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2f890 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
2f8a0 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
2f8b0 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
2f8c0 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
2f8d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
2f8e0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
2f8f0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2f900 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
2f910 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
2f920 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
2f930 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
2f940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f950 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
2f960 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
2f970 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2f980 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
2f990 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2f9a0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
2f9b0 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
2f9c0 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
2f9d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
2f9e0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
2f9f0 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
2fa00 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2fa10 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
2fa20 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
2fa30 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
2fa40 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
2fa50 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
2fa60 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2fa70 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
2fa80 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
2fa90 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
2faa0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
2fab0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2fac0 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
2fad0 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
2fae0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
2faf0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
2fb00 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
2fb10 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
2fb20 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
2fb30 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
2fb40 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
2fb50 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2fb60 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
2fb70 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
2fb80 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
2fb90 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
2fba0 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
2fbb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fbc0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2fbd0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
2fbe0 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
2fbf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fc00 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
2fc10 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2fc40 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
2fc50 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63  ile */..      rc
2fc60 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
2fc70 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2fc80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2fc90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fca0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2fcb0 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f  database is zero
2fcc0 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20   pages in size, 
2fcd0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
2fce0 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20  either (1) the. 
2fcf0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
2fd00 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66  l is a remnant f
2fd10 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61  rom a prior data
2fd20 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2fd30 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20  me name where.  
2fd40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
2fd50 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e  abase file but n
2fd60 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  ot the journal w
2fd70 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28  as deleted, or (
2fd80 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20  2) the initial. 
2fd90 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
2fda0 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c  ction that popul
2fdb0 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62  ates a new datab
2fdc0 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ase is being rol
2fdd0 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  led back..      
2fde0 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63    ** In either c
2fdf0 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ase, the journal
2fe00 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c   file can be del
2fe10 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  eted.  However, 
2fe20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20  take care.      
2fe30 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65    ** not to dele
2fe40 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2fe50 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  ile if it is alr
2fe60 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f  eady open due to
2fe70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
2fe80 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
2fe90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2fea0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
2feb0 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29  0 && !jrnlOpen )
2fec0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2fed0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
2fee0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2fef0 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44    if( pagerLockD
2ff00 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
2ff10 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
2ff20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ff30 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
2ff40 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
2ff50 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
2ff60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2ff70 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2ff80 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c  eMode ) pagerUnl
2ff90 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
2ffa0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2ffb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ffc0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
2ffd0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2ffe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fff0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
30000 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30010 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
30020 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
30030 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
30040 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
30050 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30060 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
30070 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
30080 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
30090 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
300a0 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
300b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
300c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
300d0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
300e0 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
300f0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
30100 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
30110 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
30120 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
30130 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
30140 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
30150 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
30160 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
30170 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
30180 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
30190 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
301a0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
301b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
301c0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
301d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
301e0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
301f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30200 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30220 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
30230 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
30240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
30250 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
30260 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
30270 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
30280 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30290 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
302a0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
302b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
302c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
302d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
302e0 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
30300 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
30310 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
30320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30330 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
30340 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
30350 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
30360 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
30370 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
30380 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
30390 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
303a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
303b0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
303c0 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
303d0 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72   ** it has a zer
303e0 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
303f0 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
30400 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
30410 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
30420 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
30430 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
30440 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
30450 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
30460 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
30470 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
30480 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
30490 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
304a0 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
304b0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
304c0 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
304d0 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
304e0 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
304f0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
30500 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
30510 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
30520 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
30530 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
30540 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
30550 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
30560 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
30570 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
30580 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
30590 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
305a0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
305b0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
305c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
305d0 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
305e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
305f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30600 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
30620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
30640 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
30650 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
30660 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30670 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  abase file..** I
30680 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
30690 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
306a0 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c  rAcquire() until
306b0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
306c0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
306d0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
306e0 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
306f0 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
30700 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
30710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30720 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
30730 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
30740 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
30750 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
30760 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
30770 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
30780 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
30790 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
307a0 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
307b0 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
307c0 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
307d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
307e0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
307f0 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
30800 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
30810 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
30820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
30830 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
30840 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
30850 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
30860 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
30870 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
30880 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30890 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
308a0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
308b0 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
308c0 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
308d0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
308e0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
308f0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
30900 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
30910 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
30920 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
30930 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
30940 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30950 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
30960 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
30970 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
30980 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
30990 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
309a0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
309b0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
309c0 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
309d0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
309e0 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
309f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
30a00 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
30a10 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
30a20 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
30a30 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
30a40 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
30a50 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
30a60 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
30a70 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
30a80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
30a90 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
30aa0 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
30ab0 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
30ac0 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
30ad0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
30ae0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
30af0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
30b00 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
30b10 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
30b20 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
30b30 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
30b40 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
30b50 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
30b60 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
30b70 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
30b80 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
30b90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
30ba0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
30bb0 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
30bc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30bf0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30c00 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
30c10 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
30c20 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
30c30 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
30c40 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
30c50 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
30c60 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
30c70 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
30c80 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
30c90 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
30ca0 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
30cb0 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
30cc0 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
30cd0 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
30ce0 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
30cf0 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ss mode..  */.  
30d00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30d10 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
30d20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
30d30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
30d40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
30d50 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
30d60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30d70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30d80 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
30d90 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
30da0 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  R );.  if( NEVER
30db0 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
30dc0 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
30dd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
30de0 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21  Code; }..  if( !
30df0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30e00 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65  er) && pPager->e
30e10 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30e20 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f  N ){.    int bHo
30e30 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20  tJournal = 1;   
30e40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30e50 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
30e60 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   hot journal-fil
30e70 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
30e80 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20  ( !MEMDB );..   
30e90 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
30ea0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
30eb0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
30ec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
30ee0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
30ef0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
30f00 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
30f10 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
30f20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
30f30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
30f40 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
30f50 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
30f60 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
30f70 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
30f80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
30f90 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
30fa0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
30fb0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
30fc0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
30fd0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
30fe0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
30ff0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
31000 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
31010 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e  ager, &bHotJourn
31020 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
31030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31040 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
31050 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
31060 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   if( bHotJournal
31070 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
31080 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
31090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
310a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
310b0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
310c0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
310d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
310e0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
310f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31100 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
31110 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
31120 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
31130 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
31140 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
31150 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
31160 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
31170 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
31180 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
31190 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
311a0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
311b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
311c0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
311d0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
311e0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
311f0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
31200 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
31210 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
31220 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
31230 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
31240 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
31250 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
31260 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
31270 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
31280 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
31290 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
312a0 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
312b0 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
312c0 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
312d0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
312e0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
312f0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
31300 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
31310 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
31320 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
31330 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
31340 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
31350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31360 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31370 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
31380 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e  ger is in lockin
31390 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
313a0 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
313b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e  is.      ** down
313c0 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44  graded to SHARED
313d0 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69  _LOCK before thi
313e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
313f0 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ns..      */.   
31400 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
31410 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
31420 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
31430 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31450 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31460 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31470 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
31480 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68  eady open and th
31490 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e  e file exists on
314a0 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20   disk, open the 
314b0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
314c0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
314d0 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61   access. Write a
314e0 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65  ccess is require
314f0 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20  d because .     
31500 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65   ** in exclusive
31510 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
31520 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
31530 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
31540 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  en .      ** and
31550 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
31560 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
31570 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c   later on. Also,
31580 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20   write-access . 
31590 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c       ** is usual
315a0 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  ly required to f
315b0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
315c0 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  nal in journal_m
315d0 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20  ode=persist .   
315e0 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20     ** mode (and 
315f0 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  also for journal
31600 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f  _mode=truncate o
31610 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e  n some systems).
31620 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31630 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
31640 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
31650 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
31660 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
31670 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
31680 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
31690 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
316a0 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
316b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  e .      ** this
316c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
316d0 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
316e0 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
316f0 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  r, it .      ** 
31700 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  may mean that th
31710 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74  e pager was in t
31720 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
31730 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a  hen this.      *
31740 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
31750 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
31760 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
31770 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
31780 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
31790 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
317a0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
317b0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
317c0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
317d0 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69  >pVfs;.        i
317e0 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20  nt bExists;     
317f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31800 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
31810 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
31820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31830 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
31840 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
31850 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
31860 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
31870 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20  S, &bExists);.  
31880 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31890 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
318a0 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ts ){.          
318b0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
318c0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
318d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
318e0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
318f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
31900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31910 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
31920 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
31930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
31940 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
31950 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31960 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
31970 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
31980 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31990 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
319a0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
319b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
319c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
319d0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
319e0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
319f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31a00 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
31a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31a20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31a30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31a50 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
31a60 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
31a70 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
31a80 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
31a90 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
31aa0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
31ab0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
31ac0 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
31ad0 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
31ae0 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
31af0 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
31b00 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
31b10 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
31b20 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
31b30 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
31b40 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
31b50 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31b60 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
31b70 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
31b80 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
31b90 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
31ba0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
31bb0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
31bc0 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
31bd0 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
31be0 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
31bf0 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
31c00 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
31c10 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
31c20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31c30 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
31c40 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31c50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
31c60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
31c70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
31c80 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
31c90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
31ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31cc0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
31cd0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
31ce0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31cf0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
31d00 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
31d10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
31d20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31d30 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
31d40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
31d50 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31d60 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
31d70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31d90 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
31da0 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
31db0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
31dc0 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
31dd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
31de0 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
31df0 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
31e00 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
31e10 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
31e20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
31e30 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
31e40 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
31e50 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
31e60 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
31e70 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
31e80 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
31e90 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
31ea0 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
31eb0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
31ec0 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
31ed0 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
31ee0 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
31ef0 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
31f00 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
31f10 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
31f20 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
31f30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31f40 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
31f50 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
31f60 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
31f70 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
31f80 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
31f90 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
31fa0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
31fb0 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
31fc0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
31fd0 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
31fe0 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
31ff0 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
32000 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
32010 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
32020 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
32030 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
32040 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
32050 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
32060 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
32070 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
32080 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
32090 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
320a0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
320b0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
320c0 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
320d0 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
320e0 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
320f0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
32100 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
32110 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
32120 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
32130 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
32140 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
32150 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32160 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
32170 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
32180 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32190 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
321a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
321b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
321c0 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
321d0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
321e0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
321f0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
32200 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32210 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
32220 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
32230 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
32240 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
32250 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
32260 20 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e   pPager->hasBeen
32270 55 73 65 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Used ){.      /*
32280 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
32290 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
322a0 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65  cquired then che
322b0 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ck to.      ** s
322c0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
322d0 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
322e0 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
322f0 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
32300 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75  ed,.      ** flu
32310 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
32320 68 65 20 70 50 61 67 65 72 2d 3e 68 61 73 42 65  he pPager->hasBe
32330 65 6e 55 73 65 64 20 66 6c 61 67 20 70 72 65 76  enUsed flag prev
32340 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20  ents this from. 
32350 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e       ** occurrin
32360 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69  g on the very fi
32370 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20  rst access to a 
32380 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74  file, in order t
32390 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  o save a.      *
323a0 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73  * single unneces
323b0 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65  sary sqlite3OsRe
323c0 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65  ad() call at the
323d0 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20   start-up..     
323e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
323f0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
32400 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
32410 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
32420 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
32430 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
32440 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
32450 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
32460 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
32470 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
32480 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
32490 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
324a0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
324b0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
324c0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
324d0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
324e0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
324f0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
32500 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
32510 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
32520 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
32530 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
32540 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
32550 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
32560 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
32570 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
32580 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
32590 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
325a0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
325b0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
325c0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
325d0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
325e0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
325f0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
32600 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
32610 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
32620 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
32630 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32640 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
32650 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
32660 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
32670 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
32680 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
32690 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
326a0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
326b0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
326c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
326d0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
326e0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
326f0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32700 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
32710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32720 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
32730 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
32740 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
32750 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
32770 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
32780 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
32790 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
327a0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
327b0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
327c0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
327d0 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
327e0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
327f0 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
32800 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
32810 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
32820 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
32830 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
32840 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
32850 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
32860 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
32870 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
32880 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
32890 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
328a0 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
328b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
328c0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
328d0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
328e0 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
328f0 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
32900 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
32910 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
32920 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
32930 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
32940 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
32950 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
32960 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
32970 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
32980 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
32990 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
329a0 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
329b0 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
329c0 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
329d0 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
329e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
329f0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
32a00 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
32a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32a20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
32a30 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
32a40 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
32a50 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
32a60 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
32a70 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
32a80 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
32a90 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
32aa0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
32ab0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
32ac0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
32ad0 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a  esent(pPager);..
32ae0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32af0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
32b00 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
32b10 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
32b20 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
32b30 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
32b40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
32b50 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
32b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
32b70 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
32b80 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
32b90 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
32ba0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
32bb0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
32bc0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
32bd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
32be0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
32bf0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
32c00 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
32c10 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
32c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
32c30 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
32c40 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
32c50 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
32c60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32c70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32c80 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
32c90 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
32ca0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
32cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
32cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
32cd0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
32ce0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
32cf0 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
32d00 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
32d10 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
32d20 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
32d30 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
32d40 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
32d50 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
32d60 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
32d70 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
32d80 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
32d90 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
32da0 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
32db0 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
32dc0 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
32dd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
32de0 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
32df0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
32e00 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
32e10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
32e20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
32e30 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33  t==0 && (sqlite3
32e40 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32e50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
32e60 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72  =0) ){.    pager
32e70 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
32e80 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
32e90 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
32ea0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
32eb0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
32ec0 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
32ed0 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
32ee0 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
32ef0 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
32f00 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
32f10 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
32f20 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
32f30 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
32f40 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
32f50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
32f60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
32f70 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
32f80 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
32f90 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
32fa0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
32fb0 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
32fc0 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
32fd0 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
32fe0 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
32ff0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
33000 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
33010 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
33020 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
33030 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
33040 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
33050 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
33060 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
33070 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
33080 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
33090 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
330a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
330b0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
330c0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
330d0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
330e0 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
330f0 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
33100 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
33110 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
33120 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
33130 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
33140 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
33150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
33160 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
33170 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
33180 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
33190 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
331a0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
331b0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
331c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
331d0 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
331e0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
331f0 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
33200 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
33210 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
33220 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
33230 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
33240 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
33250 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
33260 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
33270 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
33280 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
33290 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
332a0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
332b0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
332c0 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
332d0 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
332e0 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
332f0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
33300 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
33310 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
33320 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
33330 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
33340 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
33350 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
33360 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
33370 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
33380 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
33390 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
333a0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
333b0 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
333c0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
333d0 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
333e0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
333f0 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
33400 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
33410 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
33420 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
33430 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
33440 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
33450 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
33460 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
33470 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
33480 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
33490 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
334a0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
334b0 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
334c0 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
334d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
334e0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
334f0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
33500 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
33510 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
33520 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
33530 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
33540 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
33550 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
33560 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
33570 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
33580 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
33590 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
335a0 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
335b0 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
335c0 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
335d0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
335e0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
335f0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
33600 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
33610 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
33620 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
33630 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
33640 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
33650 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
33660 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
33670 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
33680 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
33690 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
336a0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
336b0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
336c0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
336d0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
336e0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
336f0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
33700 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
33710 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
33720 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
33730 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33740 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
33750 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
33760 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
33770 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
33780 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
33790 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
337a0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
337b0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
337c0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
337d0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
337e0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
337f0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
33800 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
33810 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
33820 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
33830 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
33840 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
33850 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
33860 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
33870 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
33880 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33890 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
338a0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
338b0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
338c0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
338d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
338e0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
338f0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
33900 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
33910 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
33920 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
33930 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33940 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33950 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33960 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
33970 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
33980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33990 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
339a0 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
339b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
339c0 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
339d0 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
339e0 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
339f0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
33a00 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
33a10 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
33a20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
33a30 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
33a40 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33a50 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33a60 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
33a70 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
33a80 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33a90 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
33aa0 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
33ab0 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
33ac0 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
33ad0 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
33ae0 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
33af0 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
33b00 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
33b10 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
33b20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
33b30 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d  MmapOk = (pgno!=
33b40 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50  1 && USEFETCH(pP
33b50 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61  ager).   && (pPa
33b60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33b70 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
33b80 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
33b90 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65  READONLY)).#ifde
33ba0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
33bb0 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  EC.   && pPager-
33bc0 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69  >xCodec==0.#endi
33bd0 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  f.  );..  assert
33be0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33bf0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
33c00 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
33c10 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
33c20 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
33c30 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  rt( noContent==0
33c40 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29   || bMmapOk==0 )
33c50 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
33c60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33c70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33c80 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  PT;.  }.  pPager
33c90 2d 3e 68 61 73 42 65 65 6e 55 73 65 64 20 3d 20  ->hasBeenUsed = 
33ca0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  1;..  /* If the 
33cb0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
33cc0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
33cd0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
33ce0 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
33cf0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
33d00 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
33d10 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
33d20 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
33d30 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
33d40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
33d50 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
33d60 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
33d70 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
33d80 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33d90 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
33da0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
33db0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
33dc0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
33dd0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
33de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
33df0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33e00 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
33e10 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
33e20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
33e30 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
33e40 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   0;..      rc = 
33e50 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70  sqlite3OsFetch(p
33e60 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
33e70 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
33e80 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
33e90 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
33ea0 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
33eb0 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
33ec0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33ed0 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
33ee0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33ef0 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
33f00 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20  READER ){.      
33f10 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
33f20 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
33f30 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
33f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
33f50 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
33f60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33f70 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70  AcquireMapPage(p
33f80 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61  Pager, pgno, pDa
33f90 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20  ta, &pPg);.     
33fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33fb0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
33fc0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
33fd0 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
33fe0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
33ff0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
34000 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
34010 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pg ){.          
34020 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34030 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
34040 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
34050 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
34060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
34070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34080 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
340a0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
340b0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
340c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a   }.    }..    {.
340d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63        sqlite3_pc
340e0 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65  ache_page *pBase
340f0 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20  ;.      pBase = 
34100 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34110 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
34120 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
34130 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34140 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34150 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34160 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72  tchStress(pPager
34170 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34180 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20   &pBase);.      
34190 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
341a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
341b0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
341c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
341d0 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
341e0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
341f0 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
34200 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
34210 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
34220 67 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  g==0 ) rc = SQLI
34230 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
34240 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
34250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34260 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61  /* Either the ca
34270 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
34280 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72  cheFetch() retur
34290 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20  ned an error or 
342a0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
342b0 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20   was already in 
342c0 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
342d0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
342e0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  on was called.. 
342f0 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f     ** Set pPg to
34300 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74   0 and jump to t
34310 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e  he exception han
34320 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50  dler.  */.    pP
34330 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 0;.    goto 
34340 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34350 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
34360 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
34370 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
34380 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
34390 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
343a0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
343b0 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  er==0 );..  if( 
343c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
343d0 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
343e0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
343f0 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
34400 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
34410 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
34420 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
34430 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
34440 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
34450 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
34460 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
34470 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
34480 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
34490 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
344a0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
344b0 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
344c0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
344d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
344e0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
344f0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
34500 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
34510 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
34520 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
34530 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
34540 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  */..    pPg = *p
34550 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
34560 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
34570 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
34580 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
34590 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
345a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
345b0 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
345c0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
345d0 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
345e0 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
345f0 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
34600 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
34610 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
34620 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
34630 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
34640 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
34650 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34660 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
34670 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34680 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
34690 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67  f( MEMDB || pPag
346a0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20  er->dbSize<pgno 
346b0 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20  || noContent || 
346c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
346d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
346e0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
346f0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
34700 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
34710 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
34720 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34740 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
34750 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
34760 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
34770 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
34780 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
34790 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
347a0 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
347b0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
347c0 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
347d0 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
347e0 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
347f0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
34800 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
34810 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
34820 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
34830 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
34840 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
34850 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
34860 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
34870 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
34880 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
34890 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
348a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
348b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
348c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
348d0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
348e0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
348f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
34900 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
34910 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
34920 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
34930 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
34940 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
34950 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
34960 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
34970 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
34980 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
34990 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
349a0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
349b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
349c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
349d0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
349e0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
349f0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
34a00 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
34a10 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
34a20 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
34a30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
34a40 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
34a50 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
34a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
34a70 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
34a80 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b  ager) && bMmapOk
34a90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
34aa0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
34ab0 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
34ac0 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
34ad0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
34ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34af0 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
34b00 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34b10 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
34b20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
34b30 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ger );.      pPa
34b40 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
34b50 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20  _STAT_MISS]++;. 
34b60 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
34b70 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65  Page(pPg, iFrame
34b80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
34b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34ba0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34bb0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34bd0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
34be0 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  sh(pPg);.  }..  
34bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34c00 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
34c10 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
34c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
34c30 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
34c40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
34c50 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
34c60 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
34c70 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  sed(pPager);..  
34c80 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
34c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34ca0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
34cb0 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
34cc0 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
34cd0 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
34ce0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
34cf0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
34d00 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
34d10 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
34d20 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
34d30 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
34d40 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
34d50 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
34d60 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
34d70 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
34d80 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
34d90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
34da0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
34db0 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
34dc0 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
34dd0 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
34de0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
34df0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
34e00 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
34e10 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
34e20 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
34e30 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
34e40 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
34e50 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
34e60 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
34e70 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
34e80 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
34e90 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
34ea0 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  no){.  sqlite3_p
34eb0 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67  cache_page *pPag
34ec0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
34ed0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
34ee0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
34ef0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34f00 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
34f10 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
34f20 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
34f30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34f40 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
34f50 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61   pPage==0 || pPa
34f60 67 65 72 2d 3e 68 61 73 42 65 65 6e 55 73 65 64  ger->hasBeenUsed
34f70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
34f80 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34f90 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
34fa0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
34fb0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
34fc0 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
34fd0 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
34fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
34ff0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
35000 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
35010 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
35020 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
35030 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
35040 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
35050 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
35060 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
35070 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
35080 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
35090 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
350a0 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
350b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
350c0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
350d0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
350e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
350f0 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
35100 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70   );.  pPager = p
35110 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
35120 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
35130 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
35140 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
35150 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
35160 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
35170 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
35180 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
35190 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
351a0 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ger);.}.void sql
351b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
351c0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
351d0 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33  f( pPg ) sqlite3
351e0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
351f0 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l(pPg);.}../*.**
35200 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
35210 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
35220 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
35230 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
35240 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
35250 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
35260 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
35270 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
35280 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
35290 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
352a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
352b0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
352c0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
352d0 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
352e0 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
352f0 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
35300 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
35310 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
35320 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
35330 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
35340 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
35350 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
35360 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
35370 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35380 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
35390 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
353a0 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
353b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
353c0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
353d0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
353e0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
353f0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
35400 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
35410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
35420 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
35430 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
35440 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
35450 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
35460 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
35470 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35480 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35490 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
354a0 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
354b0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
354c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
354d0 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
354e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
354f0 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
35500 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
35510 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
35520 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
35530 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
35540 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
35550 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
35560 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
35570 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
35580 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
35590 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
355a0 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
355b0 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
355c0 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
355d0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
355e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
355f0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
35600 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
35610 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
35620 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
35630 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
35640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35650 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
35660 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
35670 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
35680 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
35690 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
356a0 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
356b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
356c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
356d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
356e0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
356f0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35700 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
35710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
35720 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
35730 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
35740 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
35750 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
35760 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
35770 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
35780 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
35790 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
357a0 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
357b0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
357c0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
357d0 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
357e0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
357f0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
35800 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
35810 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
35820 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
35830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
35840 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
35850 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
35860 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35870 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
35880 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
35890 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
358a0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
358b0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
358c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
358d0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  OMEM;.    }.  . 
358e0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
358f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
35900 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
35910 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
35920 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
35930 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
35940 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
35950 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
35960 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
35970 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
35980 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
35990 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
359a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
359b0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
359c0 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
359d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
359e0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
359f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
35a00 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35a10 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
35a20 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
35a30 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
35a40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
35a50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
35a60 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
35a70 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
35a80 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
35a90 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
35aa0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
35ab0 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
35ac0 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
35ad0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
35ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
35af0 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
35b00 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
35b10 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
35b20 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
35b30 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
35b40 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
35b50 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
35b60 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
35b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35b80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
35b90 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
35ba0 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  TE.          rc 
35bb0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
35bc0 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
35bd0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
35be0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35bf0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
35c00 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
35c10 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 20  Pager).         
35c20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
35c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35c40 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
35c50 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
35c60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
35c70 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
35c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
35ca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
35cb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35cc0 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
35cd0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
35ce0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
35cf0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
35d00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
35d10 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
35d20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
35d30 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
35d40 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
35d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35d60 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
35d70 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
35d80 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
35d90 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
35da0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
35db0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
35dc0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
35dd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
35de0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
35df0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35e00 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
35e10 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
35e20 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
35e30 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
35e40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35e50 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
35e60 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
35e70 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
35e80 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35e90 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
35ea0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35eb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35ec0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35ed0 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
35ee0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
35ef0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
35f00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
35f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
35f20 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
35f30 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
35f40 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
35f50 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
35f60 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
35f70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
35f80 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
35f90 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35fa0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
35fb0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
35fc0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
35fd0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
35fe0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
35ff0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36000 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
36010 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
36020 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
36030 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
36040 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
36050 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
36060 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
36070 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
36080 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
36090 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
360a0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
360b0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
360c0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
360d0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
360e0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
360f0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
36100 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
36110 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
36120 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
36130 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
36140 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
36150 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
36160 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
36170 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
36180 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
36190 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
361a0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
361b0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
361c0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
361d0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
361e0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
361f0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
36200 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
36210 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
36220 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
36230 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
36240 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
36250 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
36260 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
36270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36280 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
36290 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
362a0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
362b0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
362c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
362d0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
362e0 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
362f0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
36300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36310 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
36320 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
36330 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
36340 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
36350 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
36360 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
36370 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
36380 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36390 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
363a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
363b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
363c0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
363d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
363e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
363f0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
36400 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
36410 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
36420 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
36430 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
36440 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36450 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
36460 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
36470 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
36480 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
36490 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
364a0 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
364b0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
364c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
364d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
364e0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
364f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36500 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
36510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36520 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
36530 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
36540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36550 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
36560 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
36570 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
36580 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
36590 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
365a0 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
365b0 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
365c0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
365d0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
365e0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
365f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
36600 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
36610 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
36620 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
36630 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
36640 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
36650 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
36660 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
36670 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
36680 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
36690 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
366a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
366b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
366c0 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
366d0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
366e0 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
366f0 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
36700 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
36710 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36720 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
36730 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
36740 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
36750 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
36760 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
36770 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
36780 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
36790 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
367a0 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
367b0 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
367c0 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
367d0 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
367e0 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
367f0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
36800 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
36810 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
36820 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
36830 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
36840 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
36850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36860 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
36870 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
36880 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
36890 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
368a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
368b0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
368c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
368d0 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
368e0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
368f0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
36900 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
36910 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
36920 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
36930 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
36940 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
36950 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
36960 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
36970 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
36980 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
36990 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
369a0 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
369b0 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
369c0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
369d0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
369e0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
369f0 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
36a00 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
36a10 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
36a20 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
36a30 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
36a40 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
36a50 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
36a60 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
36a70 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
36a80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36a90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
36aa0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
36ab0 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
36ac0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
36ad0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
36ae0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
36af0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
36b00 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
36b10 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
36b20 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36b30 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36b40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
36b50 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
36b60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36b70 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
36b80 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36b90 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
36ba0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
36bb0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
36bc0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36bd0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
36be0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36bf0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36c00 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
36c10 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
36c20 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
36c30 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
36c40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36c50 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69  ./*.** Mark a si
36c60 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61  ngle data page a
36c70 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65  s writeable. The
36c80 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
36c90 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61   into the .** ma
36ca0 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  in journal or su
36cb0 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71  b-journal as req
36cc0 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61  uired. If the pa
36cd0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
36ce0 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  to.** one of the
36cf0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63   journals, the c
36d00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
36d10 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a   is set in the .
36d20 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
36d30 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74  nal bitvec and t
36d40 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
36d50 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
36d60 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79  itvecs.** of any
36d70 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
36d80 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
36d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36da0 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
36db0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
36dc0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
36dd0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
36de0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
36df0 6e 74 20 69 6e 4a 6f 75 72 6e 61 6c 3b 0a 0a 20  nt inJournal;.. 
36e00 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
36e10 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75   is not called u
36e20 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72  nless a write-tr
36e30 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
36e40 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e  ready .  ** been
36e50 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f   started. The jo
36e60 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
36e70 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
36e80 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  n at this point.
36e90 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  .  ** It is neve
36ea0 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  r called in the 
36eb0 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a  ERROR state..  *
36ec0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
36ed0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36ee0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
36ef0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36f00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36f10 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
36f20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36f30 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36f40 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
36f50 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
36f60 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36f70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
36f80 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
36f90 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ode==0 );.  asse
36fa0 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  rt( pPager->read
36fb0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 43 48  Only==0 );..  CH
36fc0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
36fd0 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
36fe0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
36ff0 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72  e opened. Higher
37000 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
37010 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
37020 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e  * obtained the n
37030 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74  ecessary locks t
37040 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74  o begin the writ
37050 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  e-transaction, b
37060 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c  ut the.  ** roll
37070 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  back journal mig
37080 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70  ht not yet be op
37090 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20  en. Open it now 
370a0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  if this is the c
370b0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
370c0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
370d0 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
370e0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
370f0 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  y() on the page.
37100 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
37110 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e  , if it were don
37120 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20  e after calling 
37130 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
37140 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20  eDirty(), then. 
37150 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67   ** an error mig
37160 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65  ht occur and the
37170 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64   pager would end
37180 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f   up in WRITER_LO
37190 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20  CKED state.  ** 
371a0 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65  with pages marke
371b0 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68  d as dirty in th
371c0 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  e cache..  */.  
371d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
371e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
371f0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72  _LOCKED ){.    r
37200 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
37210 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
37220 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37230 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
37240 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
37250 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
37260 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
37270 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  CHEMOD );.  asse
37280 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37290 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
372a0 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
372b0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
372c0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
372d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
372e0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
372f0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
37300 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
37310 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
37320 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
37330 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
37340 6e 4a 6f 75 72 6e 61 6c 20 3d 20 70 61 67 65 49  nJournal = pageI
37350 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
37360 20 70 50 67 29 3b 0a 20 20 69 66 28 20 69 6e 4a   pPg);.  if( inJ
37370 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
37380 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
37390 20 7c 7c 20 21 73 75 62 6a 52 65 71 75 69 72 65   || !subjRequire
373a0 73 50 61 67 65 28 70 50 67 29 29 20 29 7b 0a 20  sPage(pPg)) ){. 
373b0 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
373c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
373d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
373e0 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
373f0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
37400 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
37410 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
37420 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
37430 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
37440 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
37450 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
37460 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
37470 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
37480 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
37490 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
374a0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
374b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 6e 4a   */.    if( !inJ
374c0 6f 75 72 6e 61 6c 20 26 26 20 21 70 61 67 65 72  ournal && !pager
374d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
374e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
374f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37500 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  er)==0 );.      
37510 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
37520 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
37530 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
37540 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
37550 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
37560 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
37570 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34  ta2;.        i64
37580 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
37590 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20  journalOff;..   
375a0 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
375b0 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
375c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
375d0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
375e0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
375f0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
37600 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
37610 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
37620 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
37630 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
37640 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
37650 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
37660 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
37670 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20  ager) );..      
37680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37690 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50  ->journalHdr<=pP
376a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
376b0 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
376c0 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
376d0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
376e0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
376f0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
37700 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
37710 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
37720 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
37730 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  a2);..        /*
37740 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
37750 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
37760 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
37770 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
37780 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
37790 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
377a0 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
377b0 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
377c0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
377d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
377e0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
377f0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
37800 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
37810 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
37820 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
37830 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
37840 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
37850 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
37860 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
37870 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
37880 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
37890 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
378a0 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
378b0 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
378c0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
378d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
378e0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
378f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
37900 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
37910 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
37920 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
37930 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
37940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37950 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37960 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37970 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
37980 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
37990 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
379a0 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20  e, iOff+4);.    
379b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
379c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
379d0 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
379e0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
379f0 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50  er->jfd, iOff+pP
37a00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
37a10 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
37a20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37a30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
37a40 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ..        IOTRAC
37a50 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
37a60 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
37a70 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
37a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37aa0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
37ab0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
37ac0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
37ad0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
37ae0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
37af0 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
37b00 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
37b10 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
37b20 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
37b30 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
37b40 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
37b50 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
37b60 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
37b70 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
37b80 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
37b90 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
37ba0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37bb0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20  urnalOff += 8 + 
37bc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37bd0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
37be0 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
37bf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37c00 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
37c10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
37c20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
37c30 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37c40 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
37c50 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
37c60 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
37c70 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
37c80 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37c90 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
37ca0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
37cb0 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
37cc0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
37cd0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
37ce0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
37cf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37d00 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
37d10 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
37d20 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
37d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37d40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
37d50 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
37d60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
37d70 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37d80 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  D ){.          p
37d90 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
37da0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
37db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37dc0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
37dd0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
37de0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
37df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
37e00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
37e10 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
37e20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
37e30 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
37e40 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
37e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
37e60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
37e70 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37e80 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
37e90 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
37ea0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
37eb0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
37ec0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
37ed0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
37ee0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
37ef0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
37f00 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
37f10 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
37f20 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
37f30 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
37f40 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
37f50 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
37f60 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
37f70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
37f80 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
37f90 3e 30 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  >0 && subjRequir
37fa0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
37fb0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
37fc0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
37fd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
37fe0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
37ff0 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
38000 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
38010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
38020 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
38030 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
38040 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
38050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
38060 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  *.** This is a v
38070 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65  ariant of sqlite
38080 33 50 61 67 65 72 57 72 69 74 65 28 29 20 74 68  3PagerWrite() th
38090 61 74 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  at runs when the
380a0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20   sector size.** 
380b0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
380c0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 53  he page size.  S
380d0 51 4c 69 74 65 20 6d 61 6b 65 73 20 74 68 65 20  QLite makes the 
380e0 28 72 65 61 73 6f 6e 61 62 6c 65 29 20 61 73 73  (reasonable) ass
380f0 75 6d 70 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  umption that.** 
38100 61 6c 6c 20 62 79 74 65 73 20 6f 66 20 61 20 73  all bytes of a s
38110 65 63 74 6f 72 20 61 72 65 20 77 72 69 74 74 65  ector are writte
38120 6e 20 74 6f 67 65 74 68 65 72 20 62 79 20 68 61  n together by ha
38130 72 64 77 61 72 65 2e 20 20 48 65 6e 63 65 2c 20  rdware.  Hence, 
38140 61 6c 6c 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20  all bytes of.** 
38150 61 20 73 65 63 74 6f 72 20 6e 65 65 64 20 74 6f  a sector need to
38160 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69   be journalled i
38170 6e 20 63 61 73 65 20 6f 66 20 61 20 70 6f 77 65  n case of a powe
38180 72 20 6c 6f 73 73 20 69 6e 20 74 68 65 20 6d 69  r loss in the mi
38190 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69  ddle of.** a wri
381a0 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c  te..**.** Usuall
381b0 79 2c 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  y, the sector si
381c0 7a 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ze is less than 
381d0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
381e0 70 61 67 65 20 73 69 7a 65 2c 20 69 6e 20 77 68  page size, in wh
381f0 69 63 68 0a 2a 2a 20 63 61 73 65 20 70 61 67 65  ich.** case page
38200 73 20 63 61 6e 20 62 65 20 69 6e 64 69 76 69 64  s can be individ
38210 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e 20 20  ually written.  
38220 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
38230 79 20 72 75 6e 73 20 69 6e 20 74 68 65 20 65 78  y runs in the ex
38240 63 65 70 74 69 6f 6e 61 6c 0a 2a 2a 20 63 61 73  ceptional.** cas
38250 65 20 77 68 65 72 65 20 74 68 65 20 70 61 67 65  e where the page
38260 20 73 69 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72   size is smaller
38270 20 74 68 61 6e 20 74 68 65 20 73 65 63 74 6f 72   than the sector
38280 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
38290 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
382a0 20 69 6e 74 20 70 61 67 65 72 57 72 69 74 65 4c   int pagerWriteL
382b0 61 72 67 65 53 65 63 74 6f 72 28 50 67 48 64 72  argeSector(PgHdr
382c0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
382d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
382e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
382f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn code */.  Pgn
38300 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
38310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
38320 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
38330 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
38340 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
38350 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
38360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
38370 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
38380 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
38390 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 69 6e  ated on. */.  in
383a0 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  t nPage = 0;    
383b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
383c0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
383d0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
383e0 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
383f0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
38400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38410 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
38420 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63  /.  int needSync
38430 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
38440 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
38450 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52  y page has PGHDR
38460 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 20 20  _NEED_SYNC */.  
38470 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
38480 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 20 20 2f  pPg->pPager;   /
38490 2a 20 54 68 65 20 70 61 67 65 72 20 74 68 61 74  * The pager that
384a0 20 6f 77 6e 73 20 70 50 67 20 2a 2f 0a 20 20 50   owns pPg */.  P
384b0 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
384c0 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
384d0 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
384e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
384f0 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
38500 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20  pill NOSYNC bit 
38510 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
38520 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
38530 61 6c 6c 6f 77 0a 20 20 2a 2a 20 61 20 6a 6f 75  allow.  ** a jou
38540 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62  rnal header to b
38550 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
38560 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
38570 6e 61 6c 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  naled by.  ** th
38580 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  is function..  *
38590 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  /.  assert( !MEM
385a0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
385b0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
385c0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
385d0 4e 4f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  NOSYNC)==0 );.  
385e0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
385f0 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
38600 4e 4f 53 59 4e 43 3b 0a 0a 20 20 2f 2a 20 54 68  NOSYNC;..  /* Th
38610 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
38620 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
38630 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
38640 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 2a  tor-size are.  *
38650 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
38660 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
38670 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
38680 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
38690 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
386a0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
386b0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
386c0 74 65 64 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  ted on..  */.  p
386d0 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
386e0 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
386f0 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
38700 0a 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20  .  nPageCount = 
38710 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
3872