/ Hex Artifact Content
Login

Artifact c2a4795e65b5794248dadd7c8bb65a8d9145995e:


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 2a 0a 2a 2a 20 6f 74 61  codes..**.** ota
7140: 4d 6f 64 65 0a 2a 2a 20 20 20 54 68 69 73 20 76  Mode.**   This v
7150: 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 72 6d 61  ariable is norma
7160: 6c 6c 79 20 30 2e 20 49 74 20 69 73 20 73 65 74  lly 0. It is set
7170: 20 74 6f 20 31 20 62 79 20 74 68 65 20 50 61 67   to 1 by the Pag
7180: 65 72 53 65 74 4f 74 61 4d 6f 64 65 28 29 0a 2a  erSetOtaMode().*
7190: 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61  *   function - a
71a0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
71b0: 22 50 52 41 47 4d 41 20 70 61 67 65 72 5f 6f 74  "PRAGMA pager_ot
71c0: 61 5f 6d 6f 64 65 3d 31 22 20 63 6f 6d 6d 61 6e  a_mode=1" comman
71d0: 64 2e 20 4f 6e 63 65 20 0a 2a 2a 20 20 20 74 68  d. Once .**   th
71e0: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 68 61 73  e *-oal file has
71f0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
7200: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 65 74   it has been det
7210: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
7220: 20 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 20   .**   database 
7230: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
7240: 6e 20 6d 6f 64 69 66 69 65 64 20 73 69 6e 63 65  n modified since
7250: 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2c   it was created,
7260: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 0a   this variable .
7270: 2a 2a 20 20 20 69 73 20 73 65 74 20 74 6f 20 32  **   is set to 2
7280: 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20  ..**.**   It is 
7290: 61 6c 73 6f 20 70 6f 73 73 69 62 6c 65 20 74 6f  also possible to
72a0: 20 75 73 65 20 50 61 67 65 72 53 65 74 4f 74 61   use PagerSetOta
72b0: 4d 6f 64 65 28 29 20 74 6f 20 32 20 69 66 20 74  Mode() to 2 if t
72c0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
72d0: 2a 20 20 20 61 6c 72 65 61 64 79 20 69 6e 20 57  *   already in W
72e0: 41 4c 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  AL mode. In this
72f0: 20 63 61 73 65 20 74 68 65 20 6f 6e 6c 79 20 65   case the only e
7300: 66 66 65 63 74 20 69 73 20 74 6f 20 70 72 65 76  ffect is to prev
7310: 65 6e 74 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e  ent the.**   con
7320: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 20 63 68 65  nection from che
7330: 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64  ckpointing the d
7340: 62 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  b as part of an 
7350: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
7360: 65 28 29 0a 2a 2a 20 20 20 63 61 6c 6c 2e 0a 2a  e().**   call..*
7370: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
7380: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
7390: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
73a0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
73b0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
73c0: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
73d0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
73e0: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
73f0: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
7400: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
7410: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
7420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
7430: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
7440: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
7450: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
7460: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7470: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
7480: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
7490: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
74a0: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74c0: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
74d0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
74e0: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
74f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7500: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7510: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7520: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
7530: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
7540: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
7550: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
7560: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
7570: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
7580: 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61 67    u8 walSyncFlag
7590: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
75a0: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
75b0: 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77 61  SYNC_FULL for wa
75c0: 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75 38  l writes */.  u8
75d0: 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20   syncFlags;     
75e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
75f0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7600: 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20  _FULL otherwise 
7610: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
7620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7630: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
7640: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
7650: 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20 2a  immutable file *
7660: 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20 20  /.  u8 noLock;  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20 28  /* Do not lock (
7690: 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d 6f  except in WAL mo
76a0: 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  de) */.  u8 read
76b0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
76c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
76d0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
76e0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
76f0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
7700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7710: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
7720: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 6f  le I/O */.  u8 o
7730: 74 61 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  taMode;         
7740: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
7750: 65 72 6f 20 69 66 20 69 6e 20 6f 74 61 5f 6d 6f  ero if in ota_mo
7760: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a  de */..  /******
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ****.  ** The fo
77c0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
77d0: 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61  ntains those cla
77e0: 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ss members that 
77f0: 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20  change during.  
7800: 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61  ** routine opera
7810: 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d  tion.  Class mem
7820: 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73  bers not in this
7830: 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65   block are eithe
7840: 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65  r fixed.  ** whe
7850: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 66  n the pager is f
7860: 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72 20  irst created or 
7870: 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65  else only change
7880: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
7890: 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e  .  ** significan
78a0: 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73  t mode change (s
78b0: 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20  uch as changing 
78c0: 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c  the page_size, l
78d0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a  ocking_mode,.  *
78e0: 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * or the journal
78f0: 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e  _mode).  From an
7900: 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65 73  other view, thes
7910: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7920: 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68  describe.  ** th
7930: 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68 65  e "state" of the
7940: 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74   pager, while ot
7950: 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  her class member
7960: 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 20  s describe the. 
7970: 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69   ** "configurati
7980: 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65 72  on" of the pager
7990: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ..  */.  u8 eSta
79a0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
79b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
79c0: 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45  ate (OPEN, READE
79d0: 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  R, WRITER_LOCKED
79e0: 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63  ..) */.  u8 eLoc
79f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
7a00: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7a10: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74  lock held on dat
7a20: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a30: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
7a40: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
7a50: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
7a60: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
7a70: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
7a80: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
7a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7aa0: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
7ab0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
7ac0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
7ad0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
7ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
7af0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
7b00: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
7b10: 6f 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e  o */.  u8 subjIn
7b20: 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20  Memory;         
7b30: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
7b40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d  e in-memory sub-
7b50: 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67  journals */.  Pg
7b60: 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  no dbSize;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b80: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7b90: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
7ba0: 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a    Pgno dbOrigSiz
7bb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7bc0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
7bd0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
7be0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f  action */.  Pgno
7bf0: 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20   dbFileSize;    
7c00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7c10: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
7c20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
7c30: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74  */.  Pgno dbHint
7c40: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
7c50: 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64   /* Value passed
7c60: 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48   to FCNTL_SIZE_H
7c70: 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  INT call */.  in
7c80: 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  t errCode;      
7c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
7ca0: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
7cb0: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
7cc0: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ce0: 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64  Pages journalled
7cf0: 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65   since last j-he
7d00: 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ader written */.
7d10: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d30: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
7d40: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
7d50: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
7d60: 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20   u32 nSubRec;   
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d80: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
7d90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62  s written to sub
7da0: 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69  -journal */.  Bi
7db0: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
7dc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
7dd0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
7de0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
7df0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  se file */.  sql
7e00: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
7e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7e20: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7e30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
7e40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
7e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7e60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7e70: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
7e80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7e90: 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *sjfd;         /
7ea0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7eb0: 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  r for sub-journa
7ec0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
7ed0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
7ee0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
7ef0: 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ite offset in th
7f00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
7f10: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
7f20: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
7f30: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
7f40: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
7f50: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73  al header */.  s
7f60: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
7f70: 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f  Backup;    /* Po
7f80: 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66  inter to list of
7f90: 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20   ongoing backup 
7fa0: 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50  processes */.  P
7fb0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
7fc0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
7fd0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
7fe0: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
7ff0: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8010: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
8020: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
8030: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
8040: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
8050: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
8060: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
8070: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
8080: 20 75 38 20 62 55 73 65 46 65 74 63 68 3b 20 20   u8 bUseFetch;  
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
80a0: 54 72 75 65 20 74 6f 20 75 73 65 20 78 46 65 74  True to use xFet
80b0: 63 68 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ch() */.  int nM
80c0: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
80d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
80e0: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
80f0: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
8100: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
8110: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
8120: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
8130: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
8140: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
8150: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
8160: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
8170: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
8180: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
8190: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
81a0: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
81b0: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
81c0: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
81d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8220: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8230: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
8240: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
8250: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
8260: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
8270: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
8280: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8290: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
82a0: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
82b0: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
82c0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
82d0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
82e0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
82f0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8300: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8310: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8320: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8330: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
8340: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8360: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8370: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
8380: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
8390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
83a0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
83b0: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
83c0: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
83d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
83e0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
83f0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8400: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8410: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8420: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8430: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
8440: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
8450: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
8460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8470: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
8480: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
8490: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
84a0: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
84b0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
84c0: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
84d0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
84e0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
84f0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8500: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8510: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8530: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8540: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
8550: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
8560: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
8570: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
8580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
8590: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
85a0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
85b0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
85c0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
85d0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
85e0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
85f0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8600: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8610: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8620: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8630: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
8640: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
8650: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8660: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8670: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8680: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8690: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
86a0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
86b0: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
86c0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
86d0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
86e0: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
86f0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8710: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8720: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8730: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
8740: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
8750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8760: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8770: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8780: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8790: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
87a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
87b0: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
87c0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
87d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
87e0: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8810: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8820: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8830: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8860: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8870: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8880: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
8890: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
88a0: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
88b0: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
88c0: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
88d0: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
88e0: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
88f0: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8900: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8910: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8920: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8930: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
8940: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8950: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
8960: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
8970: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
8980: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
8990: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
89a0: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
89b0: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
89c0: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
89d0: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
89e0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
89f0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8a00: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8a10: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8a20: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8a30: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8a40: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8a50: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8a60: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8a70: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8a80: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8a90: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8aa0: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8ab0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8ac0: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8ad0: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8ae0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8af0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8b00: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8b10: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8b20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8b30: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8b40: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8b50: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8b60: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8b70: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8b80: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8b90: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8ba0: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8bb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8bc0: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8bd0: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8be0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8bf0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8c00: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8c10: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8c20: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8c30: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8c50: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8c60: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8c70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8c80: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8c90: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8ca0: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8cb0: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8cc0: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8cd0: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8ce0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8cf0: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8d00: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8d10: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8d20: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8d30: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8d40: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8d50: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8d60: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8d70: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8d80: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8d90: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8da0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8db0: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8dc0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8dd0: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8de0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8df0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8e00: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8e10: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8e20: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8e30: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8e40: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8e50: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8e60: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8e70: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8e80: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8e90: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8ea0: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8eb0: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8ec0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8ed0: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8ee0: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8ef0: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8f00: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8f10: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8f20: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8f30: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8f40: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8f50: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8f60: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8f70: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8f80: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8f90: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8fa0: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8fb0: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8fc0: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8fd0: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8fe0: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8ff0: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
9000: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
9010: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
9020: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
9030: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
9040: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
9050: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9060: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9070: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9080: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9090: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
90a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
90b0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
90c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
90d0: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
90e0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
90f0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
9100: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
9110: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
9120: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
9130: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
9140: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
9150: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9160: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9170: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9180: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9190: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
91a0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
91b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
91c0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
91d0: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
91e0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
91f0: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9200: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9210: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9220: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9230: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9240: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
9250: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9260: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9270: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9280: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9290: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
92a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
92b0: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
92c0: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
92d0: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
92e0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
92f0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9300: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9310: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9320: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9330: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
9340: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
9350: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9360: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9370: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9380: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9390: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
93a0: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
93b0: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
93c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
93d0: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
93e0: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
93f0: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9400: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9410: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9420: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9430: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
9440: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
9450: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9460: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9470: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9480: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9490: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
94a0: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
94b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
94c0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
94d0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
94e0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
94f0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9500: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9510: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9520: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9530: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
9540: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
9550: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
9560: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
9570: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
9580: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
9590: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
95a0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
95b0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
95c0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
95d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
95e0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
95f0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9600: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9610: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9620: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9630: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
9640: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
9650: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
9660: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
9670: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
9680: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
9690: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
96a0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
96b0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
96c0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
96d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
96e0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
96f0: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9700: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9710: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
9720: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
9730: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
9740: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
9750: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
9760: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9770: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9780: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
9790: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
97a0: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
97b0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
97c0: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
97d0: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
97e0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
97f0: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
9800: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 6e 74 65  pagerOpenWalInte
9810: 72 6e 61 6c 28 50 61 67 65 72 2a 2c 20 69 6e 74  rnal(Pager*, int
9820: 2a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  *);..#ifndef NDE
9830: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
9840: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9850: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9860: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9870: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9880: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9890: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
98a0: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
98b0: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
98c0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
98d0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
98e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
98f0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
9900: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
9910: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9920: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9930: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
9940: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9950: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9960: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9970: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9980: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9990: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
99a0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
99b0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
99c0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
99d0: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
99e0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
99f0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
9a00: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a10: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9a20: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9a30: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9a40: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9a50: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9a60: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9a70: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9a80: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9a90: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9aa0: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9ab0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
9ac0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9ad0: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
9ae0: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
9af0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
9b00: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
9b10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9b20: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9b30: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9b40: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9b50: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9b60: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9b70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9b80: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9b90: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9ba0: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9bb0: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
9bc0: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
9bd0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
9be0: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
9bf0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
9c00: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
9c10: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9c20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9c30: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9c40: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9c50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c60: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9c70: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9c90: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9ca0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9cb0: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
9cc0: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
9cd0: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
9ce0: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
9cf0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
9d00: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
9d10: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9d20: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9d30: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9d40: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9d50: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9d60: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9d70: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9d80: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9d90: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9da0: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9db0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9dc0: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
9dd0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9de0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9df0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
9e00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
9e10: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9e20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9e30: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9e40: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9e50: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9e60: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9e70: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9e80: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9e90: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9ea0: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9eb0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
9ec0: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
9ed0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9ee0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9ef0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9f00: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9f10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9f20: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9f30: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9f40: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9f50: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9f60: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9f70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f80: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9f90: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9fa0: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9fb0: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
9fc0: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
9fd0: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
9fe0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
9ff0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
a000: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
a010: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
a020: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
a030: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
a040: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
a050: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
a060: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
a070: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
a080: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
a090: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a0a0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
a0b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0c0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a0d0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a0e0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a0f0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a100: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
a110: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
a120: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a130: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a140: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
a150: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a160: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a170: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a180: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a190: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a1b0: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
a1c0: 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  K );.      break
a1d0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a1e0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a  R_WRITER_LOCKED:
a1f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a200: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a210: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a220: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a230: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a240: 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  K );.      if( !
a250: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a260: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  er) ){.        a
a270: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a280: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a2b0: 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  dbSize==pPager->
a2c0: 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
a2d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2e0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a2f0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
a300: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a310: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a320: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a330: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a350: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
a360: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a370: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a380: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a390: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a3a0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a3b0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a3c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3d0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a3e0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a3f0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a400: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a410: 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  /* It is possibl
a420: 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61  e that if journa
a430: 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20  l_mode=wal here 
a440: 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68 65  that neither the
a450: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
a460: 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65  nal file nor the
a470: 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70   WAL file are op
a480: 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  en. This happens
a490: 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20   during.        
a4a0: 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72  ** a rollback tr
a4b0: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
a4c0: 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75  witches from jou
a4d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20  rnal_mode=off.  
a4e0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72        ** to jour
a4f0: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20  nal_mode=wal..  
a500: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a510: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a520: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
a530: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
a540: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a550: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
a560: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a570: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a580: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a590: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a5a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a5b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a5c0: 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
a5d0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
a5e0: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a5f0: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a600: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
a610: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a620: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a630: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a640: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a650: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a660: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a  R_WRITER_DBMOD:.
a670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a680: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a690: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a6a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a6b0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a6c0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a6d0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a6e0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a6f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a700: 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck>=EXCLUSIVE_LO
a710: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a720: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a730: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a740: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a750: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a760: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a770: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a780: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a790: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a7a0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
a7b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a7c0: 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d  rigSize<=pPager-
a7d0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a7e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a7f0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a800: 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20  ER_FINISHED:.   
a810: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a820: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a830: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a850: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a860: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a870: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a880: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a890: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a8a0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a8b0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a8c0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a8d0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a8e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a8f0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a900: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a910: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a920: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a930: 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20   PAGER_ERROR:.  
a940: 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73      /* There mus
a950: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
a960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  e outstanding re
a970: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
a980: 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a  ager if.      **
a990: 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e   in ERROR state.
a9a0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 70   Otherwise the p
a9b0: 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ager should have
a9c0: 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64   already dropped
a9d0: 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74  .      ** back t
a9e0: 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  o OPEN state..  
a9f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
aa00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
aa10: 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
aa20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
aa30: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
aa40: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
aa50: 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20 20  PCache)>0 );.   
aa60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
aa70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
aa80: 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44  dif /* ifndef ND
aa90: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
aaa0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a  SQLITE_DEBUG ./*
aab0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
aac0: 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e 20  nter to a human 
aad0: 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67 20  readable string 
aae0: 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66 66  in a static buff
aaf0: 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  er.** containing
ab00: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
ab10: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
ab20: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
ab30: 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73  ment. This.** is
ab40: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
ab50: 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62 75  used within debu
ab60: 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ggers. For examp
ab70: 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72 6e  le, as an altern
ab80: 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69  ative.** to "pri
ab90: 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20 67  nt *pPager" in g
aba0: 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20  db:.**.** (gdb) 
abb0: 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72 69  printf "%s", pri
abc0: 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  nt_pager_state(p
abd0: 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63  Pager).*/.static
abe0: 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61 67   char *print_pag
abf0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
ac00: 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  p){.  static cha
ac10: 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20  r zRet[1024];.. 
ac20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ac30: 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20  f(1024, zRet,.  
ac40: 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20      "Filename:  
ac50: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
ac60: 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20 20  "State:         
ac70: 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22  %s errCode=%d\n"
ac80: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20  .      "Lock:   
ac90: 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20         %s\n".   
aca0: 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65     "Locking mode
acb0: 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  :  locking_mode=
acc0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75  %s\n".      "Jou
acd0: 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72  rnal mode:  jour
ace0: 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  nal_mode=%s\n". 
acf0: 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74       "Backing st
ad00: 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64  ore: tempFile=%d
ad10: 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75   memDb=%d useJou
ad20: 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20  rnal=%d\n".     
ad30: 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20   "Journal:      
ad40: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64   journalOff=%lld
ad50: 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64   journalHdr=%lld
ad60: 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65 3a  \n".      "Size:
ad70: 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a 65            dbsize
ad80: 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25  =%d dbOrigSize=%
ad90: 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c  d dbFileSize=%d\
ada0: 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46  n".      , p->zF
adb0: 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20  ilename.      , 
adc0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
add0: 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20  _OPEN           
ade0: 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20   ? "OPEN" :.    
adf0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ae00: 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20 20  AGER_READER     
ae10: 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22 20       ? "READER" 
ae20: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ae30: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
ae40: 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57 52  R_LOCKED   ? "WR
ae50: 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20  ITER_LOCKED" :. 
ae60: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ae70: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
ae80: 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54 45  ACHEMOD ? "WRITE
ae90: 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20  R_CACHEMOD" :.  
aea0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aeb0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
aec0: 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45 52  MOD    ? "WRITER
aed0: 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  _DBMOD" :.      
aee0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
aef0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
af00: 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49 4e  ED ? "WRITER_FIN
af10: 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20 20  ISHED" :.       
af20: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
af30: 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20  R_ERROR         
af40: 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22 3f    ? "ERROR" : "?
af50: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
af60: 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a  (int)p->errCode.
af70: 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b        , p->eLock
af80: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20  ==NO_LOCK       
af90: 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a    ? "NO_LOCK" :.
afa0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
afb0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
afc0: 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a    ? "RESERVED" :
afd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
afe0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
aff0: 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22  K  ? "EXCLUSIVE"
b000: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
b010: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
b020: 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22 20       ? "SHARED" 
b030: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
b040: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
b050: 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20      ? "UNKNOWN" 
b060: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b070: 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65    , p->exclusive
b080: 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76  Mode ? "exclusiv
b090: 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20  e" : "normal".  
b0a0: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
b0b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b0c0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
b0d0: 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20   ? "memory" :.  
b0e0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b0f0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b100: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
b110: 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20   ? "off" :.     
b120: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b130: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b140: 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20  MODE_DELETE   ? 
b150: 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20  "delete" :.     
b160: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b170: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b180: 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20  MODE_PERSIST  ? 
b190: 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20  "persist" :.    
b1a0: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b1b0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b1c0: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f  LMODE_TRUNCATE ?
b1d0: 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20   "truncate" :.  
b1e0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b1f0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b200: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
b210: 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72   ? "wal" : "?err
b220: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
b230: 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28  t)p->tempFile, (
b240: 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69  int)p->memDb, (i
b250: 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  nt)p->useJournal
b260: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
b270: 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e  nalOff, p->journ
b280: 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69  alHdr.      , (i
b290: 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69  nt)p->dbSize, (i
b2a0: 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65  nt)p->dbOrigSize
b2b0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65  , (int)p->dbFile
b2c0: 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74  Size.  );..  ret
b2d0: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
b2e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
b2f0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b300: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b310: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b320: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b330: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b340: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b350: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b360: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b370: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b380: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b390: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b3a0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b3b0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b3c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b3d0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b3e0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b3f0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b400: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b410: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b420: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b430: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b440: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b450: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b460: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b470: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b480: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b490: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b4a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b4b0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b4c0: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b4d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b4e0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b4f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b500: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b510: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b520: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b530: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b540: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b550: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b570: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b580: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b590: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b5a0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b5b0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b5c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b5d0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b5e0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b5f0: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b600: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b610: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b620: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b630: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
b640: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
b650: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
b660: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
b670: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
b680: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
b690: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
b6a0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
b6b0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
b6c0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
b6d0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
b6e0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b6f0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
b700: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
b710: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
b720: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
b730: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
b740: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
b750: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
b760: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
b770: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b780: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
b790: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
b7a0: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
b7b0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
b7c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b7d0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
b7e0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
b7f0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
b800: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b810: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
b820: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
b830: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
b840: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
b850: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
b860: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
b870: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
b880: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a  ((u8*)A,B).../*.
b890: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b8a0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
b8b0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
b8c0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
b8d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
b8e0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
b8f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
b900: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
b910: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
b920: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
b930: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b940: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b950: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
b960: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
b970: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
b980: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
b990: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
b9a0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  set);.}../*.** U
b9b0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
b9c0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b9d0: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b9e0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
b9f0: 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45  LOCK.** or SHARE
ba00: 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65  D_LOCK. Regardle
ba10: 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
ba20: 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f   not the call to
ba30: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75   xUnlock().** su
ba40: 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65 20  cceeds, set the 
ba50: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
ba60: 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68  able to match th
ba70: 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65  e (attempted) ne
ba80: 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78  w lock..**.** Ex
ba90: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
baa0: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
bab0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
bac0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
bad0: 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20  s.** called, do 
bae0: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53  not modify it. S
baf0: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
bb00: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
bb10: 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f   of .** UNKNOWN_
bb20: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
bb30: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e  anation of this.
bb40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
bb50: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67  agerUnlockDb(Pag
bb60: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
bb70: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
bb80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
bb90: 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
bba0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bbb0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
bbc0: 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73  ==eLock );.  ass
bbd0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ert( eLock==NO_L
bbe0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48  OCK || eLock==SH
bbf0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
bc00: 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f  ssert( eLock!=NO
bc10: 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73  _LOCK || pagerUs
bc20: 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
bc30: 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
bc40: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
bc50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
bc60: 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20  r->eLock>=eLock 
bc70: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  );.    rc = pPag
bc80: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
bc90: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
bca0: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
bcb0: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bcc0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bcd0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
bce0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bcf0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bd00: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  ock;.    }.    I
bd10: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
bd20: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
bd30: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20  , eLock)).  }.  
bd40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bd50: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74  .** Lock the dat
bd60: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
bd70: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
bd80: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
bd90: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SHARED_LOCK,.** 
bda0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
bdb0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
bdc0: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
bdd0: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  s successful, se
bde0: 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65  t the.** Pager.e
bdf0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
be00: 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67   the new locking
be10: 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45   state. .**.** E
be20: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
be30: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
be40: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
be50: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
be60: 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64  is .** called, d
be70: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20  o not modify it 
be80: 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c  unless the new l
be90: 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20  ocking state is 
bea0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
beb0: 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  .** See the comm
bec0: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
bed0: 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e  efine of UNKNOWN
bee0: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
bef0: 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20  lanation .** of 
bf00: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
bf10: 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  int pagerLockDb(
bf20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
bf30: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
bf40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bf50: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ..  assert( eLoc
bf60: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
bf70: 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  | eLock==RESERVE
bf80: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
bf90: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
bfa0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
bfb0: 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20  >eLock<eLock || 
bfc0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
bfd0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
bfe0: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
bff0: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
c000: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f  OK : sqlite3OsLo
c010: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
c020: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
c030: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c040: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
c050: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
c060: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c070: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
c080: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c090: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
c0a0: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
c0b0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
c0c0: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
c0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c0e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c0f0: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
c100: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
c110: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
c120: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
c130: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
c140: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
c150: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c160: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
c170: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
c180: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c190: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c1a0: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
c1b0: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
c1c0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
c1d0: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
c1e0: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
c1f0: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
c200: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c210: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
c220: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
c230: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
c240: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
c250: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
c260: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
c270: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
c280: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
c290: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
c2a0: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
c2b0: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
c2c0: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
c2d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
c2e0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
c2f0: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
c300: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
c310: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
c320: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
c330: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
c340: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c350: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
c360: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c370: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
c380: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
c390: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
c3a0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
c3b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c3c0: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
c3d0: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
c3e0: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
c3f0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
c400: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
c410: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
c420: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
c430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c450: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
c460: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
c470: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c490: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
c4a0: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
c4d0: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
c4e0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
c4f0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
c500: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
c510: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
c520: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
c530: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
c540: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
c550: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
c560: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
c570: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c580: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
c590: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
c5a0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c5b0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
c5c0: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
c5d0: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
c5e0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c5f0: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
c600: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
c610: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
c620: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
c630: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
c640: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c650: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
c660: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
c670: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
c680: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c690: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c6a0: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c6b0: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c6c0: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c6d0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c6e0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c6f0: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c700: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c710: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c720: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c730: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c740: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c750: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c760: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c770: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c780: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c790: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c7a0: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c7b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c7d0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c7e0: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c7f0: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c800: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c810: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c820: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c830: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c840: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c850: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c860: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c870: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c880: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c890: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c8a0: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c8b0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c8c0: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c8d0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c8e0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c8f0: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c900: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c910: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c920: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c930: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c940: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c950: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c960: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c970: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c980: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c990: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c9a0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c9b0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c9c0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c9d0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c9e0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c9f0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
ca00: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
ca10: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
ca20: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ca30: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
ca40: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
ca50: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
ca60: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
ca70: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
ca80: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
ca90: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
caa0: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
cab0: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
cac0: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
cad0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
cae0: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
caf0: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
cb00: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
cb10: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
cb20: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
cb30: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
cb40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
cb50: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
cb60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
cb70: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
cb80: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
cb90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
cba0: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
cbb0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cbc0: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
cbd0: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
cbe0: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
cbf0: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
cc00: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
cc10: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
cc20: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
cc30: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
cc40: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
cc50: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
cc60: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
cc70: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
cc80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cc90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
cca0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
ccb0: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
ccc0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
ccd0: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
cce0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
ccf0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
cd00: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
cd10: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
cd20: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
cd30: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
cd40: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
cd50: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
cd60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cd70: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
cd80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
cd90: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
cda0: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
cdb0: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
cdc0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
cdd0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
cde0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
cdf0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
ce00: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
ce10: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
ce20: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
ce30: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
ce40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce50: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
ce60: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
ce70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
ce80: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
ce90: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
cea0: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
ceb0: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
cec0: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
ced0: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
cee0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
cef0: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
cf00: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
cf10: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
cf20: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
cf30: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
cf40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cf50: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
cf60: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
cf70: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
cf80: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
cf90: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
cfa0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
cfb0: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
cfc0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
cfd0: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
cfe0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
cff0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d000: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
d010: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
d020: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
d030: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
d040: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
d050: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
d060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d070: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
d080: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
d0a0: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
d0b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d0c0: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
d0f0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
d100: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
d110: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
d140: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
d150: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
d160: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
d170: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
d180: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
d190: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d1a0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
d1b0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
d1c0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
d1d0: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
d1e0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
d1f0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
d200: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d210: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
d220: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
d230: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
d240: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d250: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d260: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
d270: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
d280: 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c   || len==0 .   |
d290: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d2a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d2b0: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
d2c0: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
d2d0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d2e0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d2f0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
d300: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
d310: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
d320: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
d330: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d350: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
d360: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
d370: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
d380: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
d390: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
d3a0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
d3b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d3c0: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
d3d0: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
d3e0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
d3f0: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
d400: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
d410: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
d420: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
d430: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
d440: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
d450: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
d460: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
d470: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d480: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
d490: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
d4a0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
d4b0: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
d4c0: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
d4d0: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
d4e0: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
d4f0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
d500: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
d510: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
d520: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
d530: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
d540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d550: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d560: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
d570: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
d580: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
d590: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
d5a0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
d5b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d5c0: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
d5d0: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
d5e0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
d5f0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
d600: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
d610: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
d620: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
d630: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
d640: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
d650: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
d6a0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
d6b0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
d6c0: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
d6e0: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
d710: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
d720: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
d730: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
d740: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
d750: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
d760: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
d770: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
d780: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
d790: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
d7a0: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
d7b0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
d7c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d7d0: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
d7e0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
d7f0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d800: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d810: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d820: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d830: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d840: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d850: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d860: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d870: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d880: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d890: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d8a0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d8b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d8c0: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d8d0: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d8e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d8f0: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d900: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d910: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d920: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d930: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d940: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d950: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d960: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d970: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d980: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d990: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d9a0: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d9b0: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d9c0: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d9d0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d9e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d9f0: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
da00: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
da10: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
da20: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
da30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
da40: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
da50: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
da60: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
da70: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
da80: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
da90: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
daa0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
dab0: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
dac0: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
dad0: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
dae0: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
daf0: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
db00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
db10: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
db20: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
db30: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
db40: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
db50: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
db60: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
db70: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
db80: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
db90: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
dba0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
dbb0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
dbc0: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
dbd0: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
dbe0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
dbf0: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
dc00: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
dc10: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
dc20: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
dc30: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
dc40: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
dc50: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
dc60: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
dc70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
dca0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
dcb0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
dcc0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
dcd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
dce0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
dcf0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
dd00: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
dd10: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
dd20: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
dd30: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
dd40: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
dd50: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
dd60: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
dd70: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
dd80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
dd90: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
dda0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
ddb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ddc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
ddd0: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
dde0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
ddf0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
de00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
de10: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
de20: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
de30: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
de40: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
de50: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
de60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de70: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
de80: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
de90: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
dea0: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
deb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
dec0: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
ded0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
dee0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
def0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
df00: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
df10: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
df20: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
df30: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
df40: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
df50: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
df60: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
df70: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
df80: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
df90: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
dfa0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
dfb0: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
dfc0: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
dfd0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
dfe0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
dff0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
e000: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
e010: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
e020: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
e030: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
e040: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
e050: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
e060: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
e070: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
e080: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e090: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
e0a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e0b0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e0c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
e0d0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
e0e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e0f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
e100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
e110: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
e120: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e130: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
e140: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
e150: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
e160: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
e170: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e180: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
e190: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
e1a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
e1b0: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
e1c0: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
e1d0: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
e1e0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
e1f0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
e200: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
e210: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
e220: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
e230: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
e240: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
e250: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
e260: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
e270: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
e280: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
e290: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
e2a0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
e2b0: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
e2c0: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
e2d0: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
e2e0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
e2f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
e300: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
e310: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
e320: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
e330: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
e340: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
e350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
e360: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
e370: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e380: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e390: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e3a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e3b0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
e3c0: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
e3d0: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
e3e0: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
e3f0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
e400: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
e410: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
e420: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
e430: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
e440: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
e450: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
e460: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e480: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
e490: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
e4a0: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e4d0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e4e0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e4f0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
e500: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
e510: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
e520: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
e530: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
e540: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
e550: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
e560: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
e570: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e580: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
e590: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
e5a0: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
e5b0: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
e5c0: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
e5d0: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
e5e0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
e5f0: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
e600: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
e610: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
e620: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
e630: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
e640: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
e650: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
e660: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e670: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e680: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
e690: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e6a0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
e6b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e6c0: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
e6d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e6e0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
e6f0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
e700: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
e710: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
e720: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
e730: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
e740: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
e750: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
e760: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
e770: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
e780: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
e790: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
e7a0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e7b0: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e7c0: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e7d0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e7e0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e7f0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e800: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e810: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e820: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e830: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e840: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e850: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e860: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e870: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e880: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e890: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e8a0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e8b0: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e8c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e8d0: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e8e0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e8f0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e900: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e910: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e920: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e930: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e940: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e950: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e960: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e970: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e980: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e990: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e9a0: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e9b0: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e9c0: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e9d0: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e9e0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e9f0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
ea00: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
ea10: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
ea20: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
ea30: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
ea40: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
ea50: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
ea60: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
ea70: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
ea80: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
ea90: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
eaa0: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
eab0: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
eac0: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
ead0: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
eae0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
eaf0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
eb00: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
eb10: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
eb20: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
eb30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
eb40: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
eb50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
eb60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
eb70: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
eb80: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
eb90: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
eba0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
ebb0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ebc0: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
ebd0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
ebe0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
ebf0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ec00: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
ec10: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ec20: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ec30: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
ec40: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
ec50: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
ec60: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
ec70: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
ec80: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
ec90: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
eca0: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20  itializer */ .  
ecb0: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
ecc0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
ecd0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
ece0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ecf0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
ed00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ed10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
ed20: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
ed30: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
ed40: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
ed50: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
ed60: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ed70: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ed80: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
ed90: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
eda0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
edb0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
edc0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
edd0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
ede0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
edf0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
ee00: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
ee10: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
ee20: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
ee30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ee40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ee50: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
ee60: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
ee70: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
ee80: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
ee90: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
eea0: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
eeb0: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
eec0: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
eed0: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
eee0: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
eef0: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
ef00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
ef10: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
ef20: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
ef30: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
ef40: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
ef50: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
ef60: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
ef70: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
ef80: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ef90: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
efa0: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
efb0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
efc0: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
efd0: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
efe0: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
eff0: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
f000: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
f010: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f020: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
f030: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
f040: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
f050: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
f060: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
f070: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
f080: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
f090: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
f0a0: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
f0b0: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
f0c0: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
f0d0: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
f0e0: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
f0f0: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
f100: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
f110: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
f120: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
f130: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
f140: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
f150: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
f160: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
f170: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
f180: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
f190: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
f1a0: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
f1b0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
f1c0: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
f1d0: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
f1e0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
f1f0: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
f200: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
f210: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
f220: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
f230: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
f240: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
f250: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
f260: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
f270: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
f280: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
f290: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
f2a0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
f2b0: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
f2c0: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
f2d0: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
f2e0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
f2f0: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
f300: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
f310: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
f320: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
f330: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
f340: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
f350: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
f360: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
f370: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
f380: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
f390: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f3a0: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
f3b0: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
f3c0: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
f3d0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
f3e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f3f0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
f400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f410: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
f420: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
f430: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
f440: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
f450: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f460: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
f470: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
f480: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
f490: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
f4a0: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
f4b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f4c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
f4d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
f4e0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
f4f0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
f500: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
f510: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
f520: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
f530: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
f540: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
f550: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
f560: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f570: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
f580: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
f590: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
f5a0: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
f5b0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
f5c0: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
f5d0: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
f5e0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
f5f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f600: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
f610: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
f620: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
f630: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
f640: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
f650: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
f660: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
f670: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
f680: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
f690: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
f6a0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
f6b0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
f6c0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
f6d0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
f6e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
f6f0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
f700: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
f710: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f720: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
f730: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
f740: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
f750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f760: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
f770: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
f780: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
f790: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
f7a0: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f7b0: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f7c0: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f7d0: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f7e0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f7f0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f800: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f810: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f820: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f830: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f840: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f860: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f870: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f880: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f8a0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f8b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f8c0: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f8d0: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f8f0: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f900: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f910: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f940: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f950: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f960: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f990: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f9a0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f9b0: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f9c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f9d0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f9e0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fa00: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
fa10: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
fa20: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
fa30: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
fa40: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
fa50: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
fa60: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
fa70: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
fa80: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
fa90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
faa0: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
fab0: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
fac0: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
fad0: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
fae0: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
faf0: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
fb00: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
fb10: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
fb20: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
fb30: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
fb40: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
fb50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
fb60: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
fb70: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fb80: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
fb90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fba0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
fbb0: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
fbc0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
fbd0: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
fbe0: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
fbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fc00: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
fc10: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
fc20: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
fc30: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
fc40: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
fc50: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
fc60: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
fc70: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
fc80: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
fc90: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fca0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
fcb0: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
fcc0: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
fcd0: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
fce0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
fcf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fd00: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
fd10: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
fd20: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
fd30: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
fd40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fd50: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
fd60: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
fd70: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
fd80: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
fd90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
fda0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fdb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fdc0: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
fdd0: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
fde0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
fdf0: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
fe00: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
fe10: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
fe20: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
fe30: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
fe40: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
fe50: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
fe60: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
fe70: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
fe80: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
fe90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
fea0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
feb0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fec0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
fed0: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
fee0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fef0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff00: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
ff10: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
ff20: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
ff30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ff40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
ff60: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
ff70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
ff80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
ff90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
ffa0: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
ffb0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
ffc0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
ffd0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
ffe0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
fff0: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
10000 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
10010 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
10020 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
10030 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
10040 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
10050 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
10060 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
10070 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
10080 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
10090 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
100a0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
100b0 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
100c0 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
100d0 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
100e0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
100f0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10100 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
10110 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
10120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10130 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
10140 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
10150 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
10160 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
10170 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
10180 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
10190 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
101a0 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
101b0 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
101c0 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
101d0 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
101e0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
101f0 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
10200 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
10210 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
10220 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
10230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10240 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
10250 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
10260 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
10270 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10280 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
10290 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
102a0 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
102b0 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
102c0 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
102d0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
102e0 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
102f0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
10300 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
10310 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
10320 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
10330 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
10340 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
10350 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
10360 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10370 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
10380 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
10390 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
103a0 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
103b0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
103c0 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
103d0 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
103e0 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
103f0 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
10400 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
10410 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
10420 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
10430 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
10440 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
10450 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
10460 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
10470 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10480 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
10490 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
104a0 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
104b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
104c0 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
104d0 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
104e0 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
104f0 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
10500 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
10510 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
10520 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
10530 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
10540 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10550 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10560 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
10570 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
10580 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10590 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
105a0 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
105b0 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
105c0 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
105d0 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
105e0 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
105f0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
10600 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
10610 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
10620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10630 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10640 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
10650 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
10660 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
10670 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
10680 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
10690 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
106a0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
106b0 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
106c0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
106d0 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
106e0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
106f0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
10700 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
10710 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
10720 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
10730 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
10740 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
10750 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
10760 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
10770 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
10780 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
10790 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
107a0 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
107b0 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
107c0 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
107d0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
107e0 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
107f0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10800 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10810 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10820 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10830 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10840 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
10850 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
10860 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
10870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10880 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
10890 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
108a0 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
108b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108c0 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
108d0 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
108e0 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
108f0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10900 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10910 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10930 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10940 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
10950 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
10960 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
10970 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
10980 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
10990 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
109a0 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
109b0 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
109c0 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
109d0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
109e0 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
109f0 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10a00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10a10 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10a20 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
10a30 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10a40 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
10a50 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
10a60 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
10a70 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
10a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
10a90 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
10aa0 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10ab0 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10ac0 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10ad0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
10ae0 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
10af0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
10b00 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
10b10 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
10b20 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
10b30 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10b40 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
10b50 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
10b60 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
10b70 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
10b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10b90 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
10ba0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10bb0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10bc0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10bf0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10c00 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10c30 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10c40 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
10c70 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
10c80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
10c90 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10cb0 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10cc0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10cd0 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10d00 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10d10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10d20 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10d30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10d40 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
10d50 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
10d60 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
10d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10d80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10d90 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
10da0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
10db0 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20  er->jfd).  ){.  
10dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10dd0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
10de0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
10df0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10e00 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
10e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e20 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
10e30 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
10e40 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
10e50 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
10e60 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
10e70 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
10e80 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
10e90 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
10ea0 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
10eb0 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
10ec0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
10ed0 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
10ee0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
10ef0 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
10f00 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
10f10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10f20 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
10f30 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
10f40 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
10f50 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
10f60 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
10f70 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
10f80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
10f90 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
10fa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10fb0 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
10fc0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
10fd0 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
10fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10ff0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
11000 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11010 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
11020 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
11030 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
11040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
11050 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11060 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11070 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
11080 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11090 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
110a0 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
110b0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
110c0 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
110d0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
110e0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
110f0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
11100 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
11110 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11120 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11130 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11140 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
11150 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
11160 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11170 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11180 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11190 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
111a0 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
111b0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
111c0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
111d0 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
111e0 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
111f0 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
11200 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11210 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
11220 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
11230 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20  ster+20);..  /* 
11240 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11250 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
11260 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
11270 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
11280 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
11290 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
112a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
112b0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
112c0 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
112d0 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
112e0 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
112f0 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
11300 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
11310 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
11320 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
11330 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
11340 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
11350 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
11360 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
11370 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
11380 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
11390 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
113a0 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
113b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
113c0 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
113d0 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
113e0 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
113f0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
11400 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
11410 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
11420 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f   .  if( SQLITE_O
11430 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
11440 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
11450 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
11460 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  e)).   && jrnlSi
11470 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ze>pPager->journ
11480 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  alOff.  ){.    r
11490 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
114a0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
114b0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
114c0 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  alOff);.  }.  re
114d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
114e0 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e  * Discard the en
114f0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11500 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
11510 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  age-cache..*/.st
11520 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
11530 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
11540 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  ger){.  sqlite3B
11550 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
11560 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
11570 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
11580 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
11590 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  che);.}../*.** F
115a0 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
115b0 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
115c0 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
115d0 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
115e0 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
115f0 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11600 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11610 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11620 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11630 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
11640 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11650 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11670 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11680 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
11690 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116b0 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
116c0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
116d0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
116e0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
116f0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11700 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
11710 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11720 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
11730 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
11740 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
11750 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
11760 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
11770 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
11780 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  l(pPager->sjfd) 
11790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
117a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
117b0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
117c0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
117d0 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
117e0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
117f0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11800 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
11810 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
11820 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
11830 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
11840 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
11850 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
11860 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
11870 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
11880 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
11890 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
118a0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
118b0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
118c0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
118d0 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
118e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
118f0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
11900 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
11910 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
11920 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11930 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11940 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11950 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11960 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11970 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
11980 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
11990 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
119a0 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
119b0 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
119c0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
119d0 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
119e0 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
119f0 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
11a00 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
11a10 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
11a20 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
11a30 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
11a40 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
11a50 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11a60 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
11a70 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
11a80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11a90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11aa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11ab0 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11ac0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11ad0 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11ae0 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11af0 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11b00 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11b10 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11b20 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11b40 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11b50 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
11b60 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
11b70 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
11b80 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
11b90 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
11ba0 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
11bb0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
11bc0 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
11bd0 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
11be0 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
11bf0 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
11c00 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
11c10 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
11c20 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11c30 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
11c40 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
11c50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11c60 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
11c70 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
11c80 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
11c90 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
11ca0 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
11cb0 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
11cc0 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
11cd0 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
11ce0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11cf0 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
11d00 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
11d10 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
11d20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
11d30 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
11d40 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
11d50 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
11d60 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
11d70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11d80 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
11d90 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
11da0 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
11db0 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
11dc0 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
11dd0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11de0 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
11df0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e00 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
11e10 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11e20 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
11e30 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11e40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11e50 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
11e60 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11e70 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
11e80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
11e90 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
11ea0 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   0;.  releaseAll
11eb0 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
11ec0 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  r);..  if( pager
11ed0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11ee0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
11ef0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
11f00 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d) );.    sqlite
11f10 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
11f20 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
11f30 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Wal);.    pPager
11f40 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
11f50 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
11f60 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11f70 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
11f80 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fa0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74  * Error code ret
11fb0 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e  urned by pagerUn
11fc0 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20  lockDb() */.    
11fd0 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
11fe0 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
11ff0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
12000 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
12010 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
12020 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
12030 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
12040 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
12050 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
12060 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
12070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
12080 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
12090 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
120a0 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
120b0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
120c0 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
120d0 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
120e0 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
120f0 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
12100 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
12110 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12120 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12130 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
12140 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12150 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12160 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
12170 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12180 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12190 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
121a0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
121b0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
121c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
121d0 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
121e0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
121f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
12200 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
12210 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12220 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12230 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
12240 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
12250 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
12260 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
12270 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
12280 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
12290 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
122a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
122b0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
122c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
122d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
122e0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
122f0 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
12300 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f  the call to unlo
12310 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
12320 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c      ** file fail
12330 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65  s, set the curre
12340 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f  nt lock to UNKNO
12350 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65  WN_LOCK. See the
12360 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   comment.    ** 
12370 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
12380 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  e for UNKNOWN_LO
12390 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
123a0 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69  ation of why thi
123b0 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65  s.    ** is nece
123c0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
123d0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f    rc = pagerUnlo
123e0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f  ckDb(pPager, NO_
123f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
12400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
12410 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12420 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20  PAGER_ERROR ){. 
12430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
12440 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ck = UNKNOWN_LOC
12450 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
12460 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65   The pager state
12470 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20   may be changed 
12480 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52  from PAGER_ERROR
12490 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68   to PAGER_OPEN h
124a0 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f  ere.    ** witho
124b0 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  ut clearing the 
124c0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73  error code. This
124d0 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20   is intentional 
124e0 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  - the error.    
124f0 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72  ** code is clear
12500 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
12510 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c   reset in the bl
12520 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ock below..    *
12530 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
12540 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
12550 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
12560 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
12570 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12580 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12590 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
125a0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
125b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50  ;.  }..  /* If P
125c0 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
125d0 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
125e0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
125f0 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
12600 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
12610 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
12620 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
12630 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
12640 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20   pager,.  ** it 
12650 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20  can safely move 
12660 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50  back to PAGER_OP
12670 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68  EN state. This h
12680 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20  appens in both. 
12690 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65   ** normal and e
126a0 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
126b0 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   mode..  */.  if
126c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
126d0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
126e0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
126f0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12700 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
12710 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12720 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
12730 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  le;.    pPager->
12740 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12750 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  PEN;.    pPager-
12760 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
12770 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 55 53  E_OK;.    if( US
12780 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
12790 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
127a0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
127b0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67   0);.  }..  pPag
127c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
127d0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
127e0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
127f0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12800 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12820 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
12830 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
12840 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
12850 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12860 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
12870 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
12880 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
12890 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
128a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
128b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
128c0 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
128d0 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
128e0 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
128f0 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12900 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12910 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12920 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
12930 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
12940 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
12950 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12960 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
12970 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12980 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
12990 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
129a0 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
129b0 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
129c0 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
129d0 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
129e0 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
129f0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12a00 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12a10 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12a20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
12a30 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12a40 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
12a50 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12a60 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
12a70 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
12a80 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12a90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
12aa0 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
12ab0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
12ac0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12ad0 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12ae0 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12af0 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12b00 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12b10 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12b20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
12b30 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12b40 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
12b50 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12b60 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
12b70 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
12b80 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
12b90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12ba0 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
12bb0 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
12bc0 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12bd0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12be0 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12bf0 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12c00 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12c10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12c20 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
12c30 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
12c40 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
12c50 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12c70 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
12c80 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
12c90 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12ca0 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
12cb0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12cc0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12cd0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12ce0 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12cf0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12d00 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12d10 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12d20 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
12d30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
12d40 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
12d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12d60 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
12d70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12d80 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
12d90 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
12da0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12db0 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
12dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12dd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12de0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12df0 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12e00 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12e10 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12e20 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12e30 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12e40 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12e50 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
12e60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
12e70 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
12e80 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
12e90 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
12ea0 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
12eb0 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
12ec0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12ed0 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12ef0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12f00 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12f10 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12f20 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12f30 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12f40 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12f50 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
12f60 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
12f70 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
12f80 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
12f90 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
12fa0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12fb0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12fc0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12fd0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12fe0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12ff0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
13000 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
13010 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
13020 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
13030 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
13040 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
13050 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
13060 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
13070 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
13080 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
13090 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
130a0 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
130b0 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
130c0 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
130d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
130e0 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
130f0 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
13100 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
13110 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
13120 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
13130 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
13140 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
13150 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
13160 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
13170 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
13180 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
13190 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
131a0 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
131b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
131c0 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
131d0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
131e0 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
131f0 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
13200 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
13210 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
13220 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
13230 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
13240 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
13250 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
13260 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13270 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
13280 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
13290 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
132a0 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
132b0 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
132c0 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
132d0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
132e0 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
132f0 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
13300 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
13310 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
13320 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
13330 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
13340 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
13350 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
13360 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
13370 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13380 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13390 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
133a0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
133b0 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
133c0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
133d0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
133e0 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
133f0 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
13400 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
13410 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
13420 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
13430 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
13440 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
13450 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
13460 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13470 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
13480 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
13490 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
134a0 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
134b0 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
134c0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
134d0 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
134e0 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
134f0 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
13500 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
13510 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
13520 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
13530 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
13540 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
13550 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
13560 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
13570 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
13580 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
13590 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
135a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
135b0 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
135c0 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
135d0 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
135e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
135f0 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
13600 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
13610 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
13620 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
13630 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
13640 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
13650 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13660 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
13670 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
13680 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
13690 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
136a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
136b0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
136c0 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
136d0 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
136e0 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
136f0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13700 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
13710 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
13720 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
13730 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
13740 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13750 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
13760 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
13770 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
13780 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
13790 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
137a0 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  aster, int bComm
137b0 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  it){.  int rc = 
137c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
137d0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
137e0 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
137f0 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
13800 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13810 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13820 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13830 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13840 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13850 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13860 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13870 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13880 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13890 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
138a0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
138b0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
138c0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
138d0 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
138e0 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
138f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
13900 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13910 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13920 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13930 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13940 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13950 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13960 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13970 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13980 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13990 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
139a0 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
139b0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
139c0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
139d0 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
139e0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
139f0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
13a00 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13a10 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13a20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13a30 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13a40 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13a50 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13a60 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13a70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13a90 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13aa0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
13ab0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
13ac0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13ad0 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13ae0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13af0 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
13b00 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13b10 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13b20 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13b30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13b40 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13b50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13b60 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13b70 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13b80 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13b90 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13bb0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
13bc0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13bd0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13be0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13bf0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
13c00 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13c10 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13c20 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13c30 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13c40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13c50 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13c60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13c70 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13c80 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
13c90 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
13ca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13cb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13cc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13cd0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
13ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13cf0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13d00 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13d10 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13d20 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13d30 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13d40 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13d50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13d60 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
13d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13d80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13d90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13da0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
13db0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
13dc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13dd0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
13de0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
13df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
13e00 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
13e10 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
13e20 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
13e30 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
13e40 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
13e50 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
13e60 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
13e70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
13e80 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
13e90 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
13ea0 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
13eb0 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
13ec0 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
13ed0 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
13ee0 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
13ef0 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
13f00 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
13f10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13f20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
13f30 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
13f40 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
13f50 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
13f60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
13f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13f80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13f90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13fa0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13fb0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13fc0 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13fd0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13fe0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13ff0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
14000 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
14010 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
14020 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
14030 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
14040 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
14050 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14060 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
14070 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
14080 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
14090 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
140a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
140b0 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
140c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
140d0 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
140e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
140f0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
14100 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
14110 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
14120 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
14130 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
14140 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
14150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
14160 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
14170 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
14180 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
14190 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
141a0 65 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72  elete = (!pPager
141b0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71  ->tempFile && sq
141c0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73  lite3JournalExis
141d0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29  ts(pPager->jfd))
141e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
141f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14200 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14210 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
14220 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14230 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14240 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14250 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
14260 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14270 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14280 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14290 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
142a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
142b0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
142c0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
142d0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
142e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
142f0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
14300 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
14310 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
14320 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
14330 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
14340 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
14350 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
14360 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14370 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
14380 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
14390 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
143a0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
143b0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
143c0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
143d0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
143e0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
143f0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
14400 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
14410 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
14420 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14430 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
14440 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
14450 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
14460 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
14470 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
14480 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
14490 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
144a0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
144b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
144c0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
144d0 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74  PCache);.  sqlit
144e0 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
144f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14500 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14510 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
14520 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
14530 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
14540 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
14550 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
14560 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
14570 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
14580 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
14590 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
145a0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
145b0 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
145c0 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
145d0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
145e0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
145f0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14600 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
14610 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
14620 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
14630 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
14640 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  K );.  }else if(
14650 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14660 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61  & bCommit && pPa
14670 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
14680 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
14690 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
146a0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
146b0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
146c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72  transaction in r
146d0 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a  ollback-journal.
146e0 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74      ** mode if t
146f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14700 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67   on disk is larg
14710 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
14720 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
14730 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
14740 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
14750 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
14760 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
14770 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  ion .    ** succ
14780 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74  essfully committ
14790 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c  ed, but the EXCL
147a0 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74  USIVE lock is st
147b0 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  ill held on the.
147c0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
147d0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72  it is safe to tr
147e0 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
147f0 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20  ase file to its 
14800 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72  minimum.    ** r
14810 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a  equired size.  *
14820 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
14830 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
14840 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
14850 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
14860 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
14870 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
14880 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
14890 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
148a0 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50  mit && isOpen(pP
148b0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
148c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
148d0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
148e0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
148f0 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45  NTL_COMMIT_PHASE
14900 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  TWO, 0);.    if(
14910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
14920 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49  OUND ) rc = SQLI
14930 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
14940 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
14950 73 69 76 65 4d 6f 64 65 20 26 26 20 21 70 50 61  siveMode && !pPa
14960 67 65 72 2d 3e 6f 74 61 4d 6f 64 65 0a 20 20 20  ger->otaMode.   
14970 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
14980 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
14990 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
149a0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
149b0 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
149c0 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
149d0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
149e0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
149f0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14a00 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14a10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14a20 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14a30 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
14a40 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
14a50 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
14a60 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
14a70 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
14a80 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
14a90 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14aa0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14ab0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14ac0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14ad0 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14ae0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14af0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14b00 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14b10 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14b20 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14b30 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
14b40 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
14b50 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14b60 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14b70 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14b80 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14b90 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14ba0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14bb0 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14bc0 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14bd0 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14be0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14bf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14c00 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14c10 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14c20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14c30 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14c40 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14c50 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14c60 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14c70 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14c80 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14c90 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14ca0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14cb0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14cc0 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14cd0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14ce0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14cf0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14d00 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14d10 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14d20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14d30 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14d40 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14d50 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14d60 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14d70 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14d80 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14d90 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14da0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14db0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14dc0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14dd0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14de0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14df0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14e00 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14e10 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14e20 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14e30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
14e40 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
14e50 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
14e60 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
14e70 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
14e80 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
14e90 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14ea0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
14eb0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14ec0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
14ed0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14ee0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
14ef0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
14f00 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
14f10 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
14f20 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
14f30 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
14f40 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14f50 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14f70 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14f80 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14f90 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14fa0 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
14fb0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
14fc0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
14fd0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
14fe0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
14ff0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
15000 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
15010 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
15020 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
15030 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15040 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15050 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15060 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15070 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15080 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15090 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
150a0 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
150b0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
150c0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
150d0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
150e0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
150f0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
15100 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
15110 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
15120 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
15130 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15140 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15150 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15160 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15170 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15180 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15190 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
151a0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
151b0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
151c0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
151d0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
151e0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
151f0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
15200 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
15210 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
15220 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
15230 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15240 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15250 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15260 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15270 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15280 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15290 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
152a0 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
152b0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
152c0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
152d0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
152e0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
152f0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
15300 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
15310 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
15320 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
15330 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15340 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15350 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15360 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
15370 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15380 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
15390 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
153a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
153b0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
153c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
153d0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
153e0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
153f0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
15400 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
15410 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
15420 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
15430 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
15440 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
15450 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
15460 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
15470 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15480 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
15490 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
154a0 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
154b0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
154c0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
154d0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
154e0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
154f0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
15500 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
15510 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
15540 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
15550 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
15560 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
15570 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
15580 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
15590 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
155a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
155b0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
155c0 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
155d0 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
155e0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
155f0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
15600 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
15610 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
15620 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
15630 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
15640 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
15650 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
15660 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
15670 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
15680 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
15690 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
156a0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
156b0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
156c0 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
156d0 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
156e0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
156f0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
15700 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
15710 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15720 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
15730 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
15740 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15750 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
15760 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
15770 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15780 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
15790 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
157a0 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
157b0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
157c0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
157d0 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
157e0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
157f0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
15800 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
15810 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
15820 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
15830 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
15840 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
15850 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
15860 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
15870 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
15880 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
15890 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
158a0 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
158b0 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
158c0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
158d0 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
158e0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
158f0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
15900 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15910 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
15920 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15930 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15940 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
15950 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
15960 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15970 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
15980 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
15990 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
159a0 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
159b0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
159c0 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
159d0 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
159e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
159f0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
15a00 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15a10 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
15a20 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
15a30 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15a40 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
15a50 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
15a60 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
15a70 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
15a80 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
15a90 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
15aa0 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
15ab0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
15ac0 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
15ad0 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
15ae0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
15af0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
15b00 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
15b10 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
15b20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
15b30 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
15b40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15b50 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
15b60 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
15b70 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
15b80 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
15b90 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
15ba0 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
15bb0 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
15bc0 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
15bd0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
15be0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
15bf0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15c00 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
15c10 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
15c20 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15c30 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15c40 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
15c50 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
15c60 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
15c70 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
15c80 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
15c90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15ca0 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
15cb0 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
15cc0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
15cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15ce0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
15cf0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15d00 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
15d30 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
15d40 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
15d70 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
15d80 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
15d90 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
15da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
15db0 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
15dc0 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
15dd0 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
15de0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
15df0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
15e00 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15e10 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
15e20 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
15e30 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
15e40 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
15e50 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
15e60 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
15e70 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
15e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15e90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15ea0 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
15eb0 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
15ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ed0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
15ee0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
15ef0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
15f00 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
15f30 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
15f40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
15f50 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
15f60 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
15f70 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
15f80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
15f90 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
15fc0 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
15fd0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
15fe0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
15ff0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
16000 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
16010 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
16020 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
16030 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
16040 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
16050 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16060 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
16070 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
16080 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
16090 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
160a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
160b0 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
160c0 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
160d0 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
160e0 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
160f0 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
16100 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
16110 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
16120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
16130 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
16140 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
16150 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
16160 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
16170 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
16180 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
16190 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
161a0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
161b0 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
161c0 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
161d0 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
161e0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
161f0 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
16200 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
16210 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
16220 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
16230 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
16240 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16250 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
16260 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16270 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
16280 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
16290 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
162a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
162b0 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
162c0 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
162d0 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
162e0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
162f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
16300 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16320 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16330 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
16340 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
16350 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
16360 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
16370 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
16380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
16390 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
163a0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
163b0 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
163c0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
163d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
163e0 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
163f0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
16400 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
16410 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
16420 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
16430 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
16440 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16450 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
16460 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
16470 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
16480 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
16490 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
164a0 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
164b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
164c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
164d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
164e0 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
164f0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16500 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
16510 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
16520 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16530 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
16540 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
16550 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
16560 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
16570 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
16580 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
16590 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
165a0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
165b0 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
165c0 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
165d0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
165e0 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
165f0 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
16600 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
16610 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
16620 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
16630 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
16640 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
16650 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
16660 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
16670 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
16680 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
16690 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
166a0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
166b0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
166c0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
166d0 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
166e0 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
166f0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16700 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
16710 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
16720 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
16730 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
16740 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
16750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16760 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
16770 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
16780 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
16790 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
167a0 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
167b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
167c0 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
167d0 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
167e0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
167f0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
16800 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16810 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
16820 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
16830 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
16840 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79  y been played by
16850 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
16860 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
16870 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
16880 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
16890 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
168a0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
168b0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
168c0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
168d0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
168e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
168f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
16900 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
16910 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
16920 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
16930 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
16940 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
16950 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
16960 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
16970 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
16980 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
16990 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
169a0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
169b0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
169c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
169d0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
169e0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
169f0 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
16a00 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
16a10 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
16a20 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
16a30 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
16a40 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
16a50 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
16a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
16a70 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
16a80 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
16a90 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
16aa0 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
16ab0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
16ac0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
16ad0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
16ae0 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
16af0 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
16b00 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
16b10 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
16b20 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
16b30 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
16b40 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16b50 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
16b60 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
16b70 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
16b80 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
16b90 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
16ba0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
16bb0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
16bc0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
16bd0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
16be0 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
16bf0 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
16c00 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
16c10 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
16c20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
16c30 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
16c40 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
16c50 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
16c60 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
16c70 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
16c80 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
16c90 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
16ca0 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
16cb0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
16cc0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
16cd0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
16ce0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
16cf0 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
16d00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16d10 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
16d20 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16d30 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
16d40 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
16d50 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
16d60 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
16d70 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
16d80 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
16d90 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
16da0 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
16db0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
16dc0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
16dd0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
16de0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16df0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
16e00 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
16e10 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
16e20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
16e30 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
16e40 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16e50 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
16e60 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
16e70 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
16e80 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
16e90 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
16ea0 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
16eb0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
16ec0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
16ed0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
16ee0 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
16ef0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
16f00 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
16f10 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
16f20 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16f30 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
16f40 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
16f50 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
16f60 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
16f70 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
16f80 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
16f90 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
16fa0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
16fb0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
16fc0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
16fd0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
16fe0 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
16ff0 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
17000 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
17010 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
17020 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
17030 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
17040 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
17050 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
17060 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
17070 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
17080 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
17090 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
170a0 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
170b0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
170c0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
170d0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
170e0 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
170f0 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
17100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
17110 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
17120 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
17130 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
17140 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
17150 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
17160 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
17170 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
17180 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
17190 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
171a0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
171b0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
171c0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
171d0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
171e0 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
171f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
17200 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
17210 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
17220 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
17230 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
17240 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
17250 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
17260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
17270 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
17280 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
17290 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
172a0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
172b0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
172c0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
172d0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
172e0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
172f0 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
17300 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
17310 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
17320 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
17330 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
17340 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
17350 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
17360 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
17370 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
17380 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
17390 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
173a0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
173b0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
173c0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
173d0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
173e0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
173f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
17400 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
17410 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
17420 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
17430 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
17440 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
17450 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
17460 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
17470 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
17480 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
17490 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
174a0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
174b0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
174c0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
174d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
174e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
174f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
17500 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
17510 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
17520 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20  pPager->fd, (u8 
17530 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
17540 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
17550 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ;.    if( pgno>p
17560 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
17570 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
17580 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
17590 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
175a0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
175b0 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  kup ){.      COD
175c0 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
175d0 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
175e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
175f0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
17600 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
17610 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
17620 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
17630 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
17640 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c   aData, pgno, 7,
17650 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
17660 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  , aData);.    }.
17670 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
17680 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
17690 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
176a0 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
176b0 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
176c0 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
176d0 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
176e0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
176f0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
17700 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
17710 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
17720 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
17730 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
17740 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
17750 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
17760 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
17770 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
17780 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
17790 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
177a0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
177b0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
177c0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
177d0 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
177e0 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
177f0 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
17800 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
17810 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
17820 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
17830 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
17840 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
17850 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
17860 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
17870 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
17880 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
17890 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
178a0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
178b0 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
178c0 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
178d0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
178e0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
178f0 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
17900 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
17910 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
17920 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
17930 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
17940 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
17950 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
17960 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
17970 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
17980 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
17990 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
179a0 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
179b0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
179c0 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
179d0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
179e0 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
179f0 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
17a00 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
17a10 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
17a20 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
17a30 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
17a40 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
17a50 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17a60 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
17a70 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17a80 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
17a90 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
17aa0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
17ab0 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
17ac0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
17ad0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
17ae0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30  LAG_ROLLBACK)!=0
17af0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17b00 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
17b10 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17b20 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  K;.    if( rc!=S
17b30 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17b40 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
17b50 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
17b60 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
17b70 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
17b80 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
17b90 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
17ba0 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
17bb0 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
17bc0 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
17bd0 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
17be0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
17bf0 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
17c00 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
17c10 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
17c20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
17c30 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17c40 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
17c50 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
17c60 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
17c70 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
17c80 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
17c90 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
17ca0 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
17cb0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
17cc0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
17cd0 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
17ce0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
17cf0 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
17d00 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
17d10 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
17d20 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17d30 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
17d40 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
17d50 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d  Pg);.    if( isM
17d60 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
17d70 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
17d80 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
17d90 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
17da0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
17db0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
17dc0 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
17dd0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
17de0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
17df0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
17e00 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
17e10 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
17e20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
17e30 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
17e40 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
17e50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
17e60 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
17e70 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
17e80 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
17e90 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
17ea0 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
17eb0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
17ec0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
17ed0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
17ee0 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
17ef0 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
17f00 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
17f10 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
17f20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
17f30 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
17f40 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
17f50 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
17f60 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
17f70 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
17f80 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
17f90 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17fa0 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
17fb0 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
17fc0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
17fd0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
17fe0 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
17ff0 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
18000 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
18010 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
18020 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
18030 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
18040 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
18050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18060 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
18070 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
18080 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
18090 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
180a0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
180b0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
180c0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
180d0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
180e0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
180f0 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
18100 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
18110 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
18120 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18130 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
18140 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
18150 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
18160 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
18170 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
18180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
18190 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
181a0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
181b0 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
181c0 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
181d0 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
181e0 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
181f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
18200 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
18210 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
18220 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
18230 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
18240 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
18250 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
18260 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
18270 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
18280 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
18290 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
182a0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
182b0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
182c0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
182d0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
182e0 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
182f0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
18300 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
18310 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
18320 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
18330 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
18340 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
18350 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
18360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
18370 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
18380 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
18390 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
183a0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
183b0 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
183c0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
183d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
183e0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
183f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18400 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
18410 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
18420 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
18440 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
18450 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
18460 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
18470 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18480 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
18490 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
184a0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
184b0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
184c0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
184d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
184e0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
184f0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
18500 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
18510 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
18520 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
18530 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
18540 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
18550 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
18560 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
18570 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
18580 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
18590 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
185a0 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
185b0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
185c0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
185d0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
185e0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
185f0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
18600 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
18610 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
18620 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
18630 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
18640 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
18650 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
18660 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
18670 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
18680 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
18690 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
186a0 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
186b0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
186c0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
186d0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
186e0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
186f0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
18700 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
18710 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
18720 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
18730 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
18740 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
18750 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
18760 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
18770 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
18780 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
18790 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
187a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
187b0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
187c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
187d0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
187e0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
187f0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18800 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
18810 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
18820 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
18830 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
18840 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18850 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
18860 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
18870 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18880 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
18890 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
188a0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
188b0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
188c0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
188d0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
188e0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
188f0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
18900 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
18910 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
18920 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
18930 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
18940 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
18950 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
18960 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
18970 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
18980 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
18990 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
189a0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
189b0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
189c0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
189d0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
189e0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
189f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
18a00 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
18a10 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
18a20 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
18a30 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
18a40 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
18a50 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
18a60 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
18a70 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
18a80 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
18a90 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
18aa0 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
18ab0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
18ac0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
18ad0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
18ae0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
18af0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
18b00 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
18b10 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
18b20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18b30 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
18b40 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
18b50 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
18b60 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
18b70 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
18b80 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
18b90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
18ba0 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
18bb0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
18bc0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
18bd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18be0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
18bf0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18c20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18c30 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
18c40 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
18c50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
18c60 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
18c70 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
18c80 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
18c90 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
18ca0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18cb0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18cc0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
18cd0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
18ce0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18cf0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
18d00 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
18d10 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
18d20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18d30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
18d40 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
18d50 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
18d60 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
18d70 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
18d80 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
18d90 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
18da0 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
18db0 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
18dc0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
18dd0 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
18de0 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
18df0 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
18e00 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
18e10 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
18e20 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
18e30 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
18e40 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
18e50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
18e60 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
18e70 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
18e80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18e90 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
18ea0 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
18eb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
18ec0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
18ed0 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
18ee0 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
18ef0 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
18f00 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
18f10 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
18f20 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
18f30 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
18f40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18f50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
18f60 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
18f70 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
18f80 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
18f90 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
18fa0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18fb0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
18fc0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
18fd0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
18fe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18ff0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19000 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
19010 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
19020 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19030 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
19040 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
19050 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
19060 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
19070 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
19080 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
19090 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
190a0 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
190b0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
190c0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
190d0 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
190e0 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
190f0 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
19100 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
19110 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
19120 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19130 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
19140 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19160 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
19170 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
19180 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
19190 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
191a0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
191b0 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
191c0 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
191d0 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
191e0 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
191f0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
19200 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19210 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19220 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
19230 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
19240 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
19250 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
19260 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
19270 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
19280 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
19290 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
192a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
192b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
192c0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
192d0 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
192e0 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
192f0 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
19300 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
19310 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
19320 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
19330 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
19340 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
19350 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
19360 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
19370 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
19380 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
19390 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
193a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
193b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
193c0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
193d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
193e0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
193f0 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
19400 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
19410 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
19420 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
19430 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
19440 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
19450 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
19460 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
19470 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
19480 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
19490 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
194a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
194b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
194c0 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
194d0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
194e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
194f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
19500 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
19510 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19520 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
19530 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
19540 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
19550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19560 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19570 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19580 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
19590 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
195a0 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
195b0 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
195c0 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
195d0 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
195e0 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
195f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19600 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19610 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19620 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
19630 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
19640 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
19650 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
19660 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
19670 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
19680 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
19690 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
196a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
196b0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
196c0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
196d0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
196e0 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
196f0 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
19700 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
19710 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
19720 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19730 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19740 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
19750 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
19760 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
19770 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
19780 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19790 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
197a0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
197b0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
197c0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
197d0 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
197e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
197f0 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
19800 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
19810 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19820 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
19830 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
19840 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19850 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
19860 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
19870 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
19880 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
19890 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
198a0 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
198b0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
198c0 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
198d0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
198e0 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
198f0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19900 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
19910 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
19920 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
19930 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
19940 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
19950 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
19960 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
19970 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
19980 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
19990 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
199a0 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
199b0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
199c0 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
199d0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
199e0 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
199f0 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
19a00 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
19a10 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
19a20 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
19a30 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
19a40 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
19a50 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
19a60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
19a70 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
19a80 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
19a90 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
19aa0 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
19ab0 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
19ac0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
19ad0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
19ae0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
19af0 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
19b00 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
19b10 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
19b20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
19b30 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
19b40 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
19b50 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
19b60 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
19b70 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
19b80 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
19b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
19ba0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
19bb0 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
19bc0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
19bd0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
19be0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
19bf0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
19c00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19c10 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
19c20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
19c30 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
19c40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
19c50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19c60 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
19c70 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
19c80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
19c90 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
19ca0 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28    .  if( isOpen(
19cb0 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
19cc0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
19cd0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
19ce0 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
19cf0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
19d00 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20  OPEN) .  ){.    
19d10 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
19d20 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e   newSize;.    in
19d30 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
19d40 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
19d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19d60 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
19d70 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a  E_LOCK );.    /*
19d80 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
19d90 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
19da0 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
19db0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
19dc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
19dd0 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
19de0 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
19df0 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69  Size = szPage*(i
19e00 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
19e10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19e20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
19e30 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19e40 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
19e50 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
19e60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19e70 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
19e80 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
19e90 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19ea0 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a   (currentSize+sz
19eb0 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29  Page)<=newSize )
19ec0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
19ed0 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
19ee0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
19ef0 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
19f00 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
19f10 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
19f20 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
19f30 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
19f40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19f50 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
19f60 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
19f70 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
19f80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
19f90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
19fa0 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
19fb0 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
19fc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
19fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19fe0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
19ff0 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
1a000 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1a010 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a030 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65  n a sanitized ve
1a040 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63  rsion of the sec
1a050 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66  tor-size of OS f
1a060 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a  ile pFile. The.*
1a070 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1a080 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1a090 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61  lie between 32 a
1a0a0 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  nd MAX_SECTOR_SI
1a0b0 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ZE..*/.int sqlit
1a0c0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  e3SectorSize(sql
1a0d0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1a0e0 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20  ){.  int iRet = 
1a0f0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
1a100 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ize(pFile);.  if
1a110 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20  ( iRet<32 ){.   
1a120 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d   iRet = 512;.  }
1a130 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41  else if( iRet>MA
1a140 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
1a150 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
1a160 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
1a170 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 );.    iRet = 
1a180 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
1a190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1a1a0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  et;.}../*.** Set
1a1b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1a1c0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1a1d0 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
1a1e0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
1a1f0 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
1a200 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1a210 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1a220 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
1a230 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1a240 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
1a250 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
1a260 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72  sed .** to deter
1a270 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e  mine the size an
1a280 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a  d alignment of j
1a290 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e  ournal header an
1a2a0 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  d .** master jou
1a2b0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69  rnal pointers wi
1a2c0 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75  thin created jou
1a2d0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
1a2e0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
1a2f0 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74  files the effect
1a300 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a310 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  is always 512 by
1a320 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  tes..**.** Other
1a330 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65  wise, for non-te
1a340 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74  mporary files, t
1a350 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a360 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74  tor size is.** t
1a370 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1a380 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
1a390 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f  Size() method ro
1a3a0 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69  unded up to 32 i
1a3b0 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
1a3c0 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e  than 32, or roun
1a3d0 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f  ded down to MAX_
1a3e0 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69  SECTOR_SIZE if i
1a3f0 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
1a400 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  than MAX_SECTOR_
1a410 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  SIZE..**.** If t
1a420 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20  he file has the 
1a430 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1a440 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a450 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
1a460 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63  set.** the effec
1a470 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a480 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20   to its minimum 
1a490 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68  value (512).  Th
1a4a0 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20  e purpose of.** 
1a4b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a4c0 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20  ze is to define 
1a4d0 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75  the "blast radiu
1a4e0 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  s" of bytes that
1a4f0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1a500 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   if a crash occu
1a510 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  rs while writing
1a520 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74   to a single byt
1a530 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e  e in.** that ran
1a540 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f  ge.  But with PO
1a550 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a560 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64  E, the blast rad
1a570 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28  ius is zero.** (
1a580 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57  that is what POW
1a590 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a5a0 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d   means), so we m
1a5b0 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74  inimize the sect
1a5c0 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72  or.** size.  For
1a5d0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
1a5e0 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  tibility of the 
1a5f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a600 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a   file format,.**
1a610 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63   we cannot reduc
1a620 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1a630 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f  sector size belo
1a640 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  w 512..*/.static
1a650 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
1a660 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
1a670 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
1a680 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1a690 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1a6a0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  File );..  if( p
1a6b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
1a6c0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
1a6d0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a6e0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a6f0 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) & .           
1a700 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1a710 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1a720 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ITE)!=0.  ){.   
1a730 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
1a740 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
1a750 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a760 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
1a770 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
1a780 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1a790 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
1a7a0 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
1a7b0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
1a7c0 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
1a7d0 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  lt. */.    pPage
1a7e0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1a7f0 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  512;.  }else{.  
1a800 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1a810 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65  Size = sqlite3Se
1a820 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
1a830 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >fd);.  }.}../*.
1a840 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
1a850 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
1a860 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1a870 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
1a880 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
1a890 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
1a8a0 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
1a8b0 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
1a8c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a8d0 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
1a8e0 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
1a8f0 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
1a900 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
1a910 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
1a920 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
1a930 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a940 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1a950 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
1a960 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
1a970 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
1a980 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
1a990 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1a9a0 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
1a9b0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
1a9c0 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
1a9d0 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
1a9e0 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
1a9f0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1aa00 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1aa10 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
1aa20 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
1aa30 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
1aa40 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
1aa50 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
1aa60 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1aa70 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1aa80 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
1aa90 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
1aaa0 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
1aab0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
1aac0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1aad0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1aae0 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
1aaf0 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
1ab00 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
1ab10 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
1ab20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
1ab30 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1ab40 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1ab50 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
1ab60 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
1ab70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
1ab80 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
1ab90 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
1aba0 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
1abb0 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
1abc0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
1abd0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1abe0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1abf0 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
1ac00 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
1ac10 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
1ac20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
1ac30 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
1ac40 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
1ac50 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1ac60 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
1ac70 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
1ac80 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
1ac90 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1aca0 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1acb0 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
1acc0 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
1acd0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
1ace0 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
1acf0 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
1ad00 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
1ad10 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
1ad20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1ad30 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
1ad40 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
1ad50 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
1ad60 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
1ad70 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1ad80 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
1ad90 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
1ada0 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
1adb0 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
1adc0 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
1add0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1ade0 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
1adf0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1ae00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
1ae10 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1ae20 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
1ae30 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
1ae40 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
1ae50 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
1ae60 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
1ae70 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
1ae80 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
1ae90 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
1aea0 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
1aeb0 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
1aec0 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
1aed0 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
1aee0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
1aef0 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1af00 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
1af10 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1af20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
1af30 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
1af40 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
1af50 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
1af60 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
1af70 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
1af80 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
1af90 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
1afa0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
1afb0 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
1afc0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
1afd0 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
1afe0 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
1aff0 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
1b000 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
1b010 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
1b020 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
1b030 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
1b040 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
1b050 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
1b060 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
1b070 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
1b080 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
1b090 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
1b0a0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
1b0b0 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
1b0c0 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
1b0d0 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
1b0e0 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
1b0f0 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
1b100 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
1b110 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
1b120 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
1b130 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
1b140 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1b150 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
1b160 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
1b170 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
1b180 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
1b190 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
1b1a0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
1b1b0 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
1b1c0 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
1b1d0 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
1b1e0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b1f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
1b200 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
1b210 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
1b220 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1b230 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
1b240 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
1b250 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
1b260 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
1b270 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
1b280 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
1b290 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
1b2a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
1b2b0 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
1b2c0 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
1b2d0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
1b2e0 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
1b2f0 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
1b300 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
1b310 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
1b320 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
1b330 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
1b340 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
1b350 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
1b360 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b370 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
1b380 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1b390 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
1b3a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1b3b0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1b3c0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1b3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b3e0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1b3f0 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
1b400 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b420 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
1b430 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
1b440 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
1b470 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
1b480 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
1b490 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b4a0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
1b4b0 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
1b4c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b4e0 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
1b4f0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b500 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
1b510 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1b520 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1b530 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
1b540 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
1b550 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
1b560 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
1b570 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
1b580 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
1b590 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
1b5a0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
1b5b0 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
1b5c0 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
1b5d0 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c  ack */.  int nPl
1b5e0 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20  ayback = 0;     
1b5f0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1b600 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f  r of pages resto
1b610 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  red from journal
1b620 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1b630 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1b640 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1b650 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1b660 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1b670 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1b680 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1b690 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1b6a0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1b6b0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1b6c0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1b6d0 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1b6e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b6f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b700 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1b710 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1b720 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1b730 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1b740 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1b750 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1b760 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1b770 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1b780 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1b790 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1b7a0 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1b7b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b7c0 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1b7d0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1b7e0 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1b7f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1b800 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1b810 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1b820 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1b830 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1b840 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1b850 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1b860 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1b870 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1b880 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1b890 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1b8a0 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1b8b0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1b8c0 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1b8d0 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1b8e0 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1b8f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1b900 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1b910 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1b920 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1b930 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1b940 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1b950 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1b960 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1b970 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1b980 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1b990 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1b9a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b9b0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1b9c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1b9d0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1b9e0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1b9f0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1ba00 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1ba10 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1ba20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1ba30 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1ba40 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1ba50 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1ba60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1ba70 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1ba80 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1ba90 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1baa0 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1bab0 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1bac0 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1bad0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1bae0 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1baf0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1bb00 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1bb10 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1bb20 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1bb30 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1bb40 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1bb50 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1bb60 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1bb70 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1bb80 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1bb90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1bba0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1bbb0 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1bbc0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1bbd0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1bbe0 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1bbf0 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1bc00 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1bc10 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1bc20 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1bc30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1bc40 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1bc50 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1bc60 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1bc70 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1bc80 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1bc90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bca0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1bcb0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1bcc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bcd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1bce0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1bcf0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1bd00 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1bd10 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1bd20 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1bd30 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1bd40 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1bd50 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1bd60 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1bd70 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1bd80 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1bd90 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1bda0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1bdb0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1bdc0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1bdd0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1bde0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1bdf0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1be00 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1be10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1be20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1be30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1be40 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1be50 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1be60 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1be70 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1be80 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1be90 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bea0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1beb0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1bec0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1bed0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1bee0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1bef0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1bf00 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1bf10 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1bf20 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1bf30 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1bf40 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1bf50 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1bf60 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1bf70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1bf80 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1bf90 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1bfa0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1bfb0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1bfc0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1bfd0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1bfe0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1bff0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1c000 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c010 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1c020 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1c030 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1c040 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1c050 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1c060 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1c070 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1c080 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1c090 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1c0a0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1c0b0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1c0c0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1c0d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1c0e0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1c0f0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1c100 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1c110 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1c120 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1c130 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1c140 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c150 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1c160 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1c170 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1c180 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1c190 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1c1a0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1c1b0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1c1c0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1c1d0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1c1e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1c1f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c200 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1c210 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1c220 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1c230 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1c240 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1c250 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1c260 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1c270 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1c280 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1c290 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c2a0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c2b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1c2c0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1c2d0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1c2e0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1c2f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1c300 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1c310 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1c320 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1c330 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1c340 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1c350 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1c360 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1c370 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1c380 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1c390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c3a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1c3b0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c3c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c3d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c3e0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1c3f0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1c400 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1c410 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1c420 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1c430 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1c440 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1c450 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1c460 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1c470 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1c480 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1c490 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1c4a0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1c4b0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1c4c0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1c4d0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1c4e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1c4f0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1c500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c510 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1c520 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c530 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  OK ){.        nP
1c540 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  layback++;.     
1c550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1c570 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1c580 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c590 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1c5a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c5b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1c5c0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c5d0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c5e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1c5f0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1c600 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1c610 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1c620 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1c630 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1c640 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1c650 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1c660 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1c670 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1c680 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1c690 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1c6a0 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1c6b0 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1c6c0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1c6d0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1c6e0 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1c6f0 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1c700 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1c710 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1c720 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1c730 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1c740 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1c750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
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 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c790 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1c7a0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1c7b0 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1c7c0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1c7d0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1c7e0 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1c7f0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1c800 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1c810 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1c820 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1c830 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1c840 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1c850 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1c860 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c870 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1c880 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1c890 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1c8a0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1c8b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1c8c0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c8d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c8e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1c8f0 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1c900 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1c910 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1c920 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1c930 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1c940 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1c950 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1c960 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1c970 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1c980 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1c990 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1c9a0 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1c9b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1c9c0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1c9d0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1c9e0 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1c9f0 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1ca00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ca10 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1ca20 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1ca30 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ca40 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1ca50 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1ca60 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1ca70 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1ca80 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1ca90 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1caa0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1cab0 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1cac0 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1cad0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1cae0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1caf0 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1cb00 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1cb10 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1cb20 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1cb30 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1cb40 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1cb50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1cb60 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1cb70 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1cb80 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1cb90 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1cba0 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1cbb0 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1cbc0 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1cbd0 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1cbe0 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1cbf0 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1cc00 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1cc10 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1cc20 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1cc30 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1cc40 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1cc50 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1cc60 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1cc70 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1cc80 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1cc90 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1cca0 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1ccb0 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1ccc0 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1ccd0 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1cce0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1ccf0 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1cd00 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1cd10 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1cd20 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1cd30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cd40 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1cd50 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1cd60 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1cd70 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1cd80 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1cd90 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1cda0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1cdb0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1cdc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1cdd0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cde0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1cdf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1ce00 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1ce10 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1ce20 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1ce30 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1ce40 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1ce50 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
1ce60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ce70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1ce80 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1ce90 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
1cea0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c  Master[0]!='\0',
1ceb0 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   0);.    testcas
1cec0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1ced0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1cee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1cef0 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1cf00 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1cf10 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1cf20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1cf30 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1cf40 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1cf50 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1cf60 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1cf70 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1cf80 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1cf90 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1cfa0 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1cfb0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1cfc0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1cfd0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1cfe0 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50   if( isHot && nP
1cff0 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  layback ){.    s
1d000 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
1d010 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
1d020 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f  _ROLLBACK, "reco
1d030 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66  vered %d pages f
1d040 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rom %s",.       
1d050 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61           nPlayba
1d060 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ck, pPager->zJou
1d070 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rnal);.  }..  /*
1d080 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1d090 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1d0a0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1d0b0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1d0c0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1d0d0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1d0e0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1d0f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1d100 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1d110 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1d120 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d130 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1d140 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1d150 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1d160 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d170 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1d180 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1d190 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1d1a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d1b0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1d1c0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1d1d0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1d1e0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1d1f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1d200 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1d210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d220 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1d230 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1d240 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1d250 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1d260 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1d270 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1d280 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d290 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1d2a0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1d2b0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1d2c0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1d2d0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1d2e0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1d2f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1d300 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1d310 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1d320 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33  e(PgHdr *pPg, u3
1d330 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67  2 iFrame){.  Pag
1d340 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1d350 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1d360 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1d370 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1d380 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1d390 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1d3a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1d3b0 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1d3c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d3d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1d3e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d3f0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1d400 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1d410 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1d420 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1d430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d440 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1d450 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1d460 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1d470 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1d480 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1d490 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
1d4a0 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f   iFrame ){.    /
1d4b0 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
1d4c0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1d4d0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
1d4e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1d4f0 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65  ite3WalReadFrame
1d500 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69  (pPager->pWal, i
1d510 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67  Frame, pgsz, pPg
1d520 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1d530 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1d540 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1d550 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1d560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1d570 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d580 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1d590 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d5a0 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1d5b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d5c0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1d5d0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1d5e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d5f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1d600 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1d610 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1d620 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1d630 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1d640 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1d650 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1d660 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1d670 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1d680 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1d690 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1d6a0 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1d6b0 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1d6c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1d6d0 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1d6e0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1d6f0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1d700 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d710 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1d720 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1d730 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1d740 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1d750 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1d760 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1d770 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1d780 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1d790 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1d7a0 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1d7b0 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1d7c0 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1d7d0 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1d7e0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1d7f0 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1d800 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1d810 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1d820 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1d830 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1d840 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1d850 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1d860 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1d870 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31  noise equaling 1
1d880 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1d890 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1d8a0 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1d8b0 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1d8c0 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1d8d0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1d8e0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d8f0 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1d900 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d910 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1d920 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1d930 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1d940 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1d950 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1d960 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1d970 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1d980 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1d990 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1d9a0 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1d9b0 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1d9c0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
1d9d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
1d9e0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1d9f0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1da00 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1da10 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1da20 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1da30 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1da40 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1da50 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1da60 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1da70 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1da90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1daa0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1dab0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1dac0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1dad0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1dae0 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1daf0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1db00 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1db10 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1db20 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1db30 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1db40 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1db50 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1db60 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1db70 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1db80 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1db90 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1dba0 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1dbb0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1dbc0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1dbd0 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1dbe0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1dbf0 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1dc00 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1dc10 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1dc20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1dc30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1dc40 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1dc50 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1dc60 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1dc70 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1dc80 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1dc90 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1dca0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1dcb0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1dcc0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1dcd0 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1dce0 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1dcf0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1dd00 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1dd10 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1dd20 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1dd30 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1dd40 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1dd50 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1dd60 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1dd70 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1dd80 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1dd90 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1dda0 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1ddb0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1ddc0 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1ddd0 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1dde0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1ddf0 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1de00 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1de10 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1de20 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1de30 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1de40 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1de50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1de60 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1de70 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1de80 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1de90 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1dea0 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1deb0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1dec0 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1ded0 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1dee0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1def0 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1df00 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1df10 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1df20 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1df30 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1df40 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1df50 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1df60 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1df70 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1df80 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1df90 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1dfa0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1dfb0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1dfc0 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1dfd0 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1dfe0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1dff0 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1e000 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1e010 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1e020 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1e030 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1e040 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1e050 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1e060 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1e070 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1e080 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1e090 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e0a0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1e0b0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1e0c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1e0d0 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1e0e0 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1e0f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e100 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1e110 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1e120 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1e130 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
1e140 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e150 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20  ger) );.  pPg = 
1e160 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1e170 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1e180 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1e190 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1e1a0 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1e1b0 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1e1c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1e1d0 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1e1e0 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46  se{.      u32 iF
1e1f0 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rame = 0;.      
1e200 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e210 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1e220 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1e230 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1e240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e260 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1e270 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
1e280 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e2a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e2b0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1e2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e2d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1e2e0 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1e2f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1e300 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1e310 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1e320 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1e330 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1e340 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1e350 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1e360 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1e370 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1e380 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1e390 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1e3a0 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1e3b0 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1e3c0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1e3d0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1e3e0 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1e3f0 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1e400 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1e410 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1e420 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1e430 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1e440 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1e450 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1e460 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1e470 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1e480 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1e490 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1e4a0 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1e4b0 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1e4c0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1e4d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1e4e0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1e4f0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1e500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e510 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e520 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1e530 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e540 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1e550 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1e560 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1e570 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1e580 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e5b0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1e5c0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e5e0 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1e5f0 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1e600 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1e610 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1e620 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1e630 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1e640 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1e650 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1e660 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1e670 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1e680 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1e690 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1e6a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1e6b0 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1e6c0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1e6d0 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1e6e0 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1e6f0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1e700 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1e710 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1e720 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1e730 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1e740 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1e750 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1e760 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1e770 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1e780 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1e790 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e7a0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1e7b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e7c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1e7d0 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1e7e0 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1e7f0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1e800 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1e810 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e820 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1e830 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1e840 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1e850 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1e860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e870 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e880 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1e890 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1e8a0 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1e8b0 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1e8c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1e8d0 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1e8e0 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1e8f0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1e900 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1e910 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1e920 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1e930 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1e940 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1e950 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1e960 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1e970 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1e980 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e990 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1e9a0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1e9b0 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1e9c0 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1e9d0 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1e9e0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1e9f0 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1ea00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1ea10 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1ea20 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1ea30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ea40 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1ea50 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1ea80 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1ea90 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eab0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1eac0 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1ead0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1eae0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1eaf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1eb00 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1eb10 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1eb20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eb30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1eb40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1eb50 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb70 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1eb80 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66   in pList */.#if
1eb90 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1eba0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1ebb0 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  d(SQLITE_CHECK_P
1ebc0 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70  AGES).  PgHdr *p
1ebd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ebe0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1ebf0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1ec00 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  s */.#endif..  a
1ec10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1ec20 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1ec30 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1ec40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ec50 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1ec60 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1ec70 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1ec80 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1ec90 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1eca0 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1ecb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ecc0 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1ecd0 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1ece0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1ecf0 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1ed00 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1ed10 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1ed20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1ed30 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1ed40 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1ed50 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1ed60 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1ed70 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1ed80 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1ed90 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1eda0 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1edb0 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1edc0 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1edd0 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1ede0 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1edf0 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1ee00 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1ee10 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1ee20 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1ee30 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1ee40 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1ee50 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1ee60 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1ee70 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1ee80 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1ee90 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1eea0 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1eeb0 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1eec0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1eed0 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1eee0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1eef0 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1ef00 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1ef10 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1ef20 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1ef30 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1ef40 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1ef50 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1ef60 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1ef70 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1ef80 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1ef90 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1efa0 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1efb0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1efc0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1efd0 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1efe0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1eff0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1f000 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1f010 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1f020 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
1f030 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1f040 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f050 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1f060 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1f070 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
1f080 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
1f090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1f0a0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1f0b0 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d  _PAGES.  pList =
1f0c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1f0d0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1f0e0 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28  pPCache);.  for(
1f0f0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1f100 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61  >pDirty){.    pa
1f110 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
1f120 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
1f130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f140 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1f150 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1f160 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1f170 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1f180 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1f190 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1f1a0 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1f1b0 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1f1c0 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1f1d0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1f1e0 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
1f1f0 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
1f200 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
1f210 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
1f220 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
1f230 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
1f240 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
1f250 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
1f260 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
1f270 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
1f280 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
1f290 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1f2a0 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
1f2b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1f2e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
1f2f0 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
1f300 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f310 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
1f320 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
1f330 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1f340 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
1f350 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f360 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f370 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
1f380 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
1f390 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
1f3a0 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1f3b0 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
1f3c0 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
1f3d0 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
1f3e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
1f3f0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
1f400 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
1f410 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
1f420 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
1f430 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
1f440 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
1f450 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1f460 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
1f470 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
1f480 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
1f490 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1f4a0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1f4b0 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
1f4c0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
1f4d0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1f4e0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
1f4f0 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
1f500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1f510 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  | changed ){.   
1f520 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1f530 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53  ger);.    if( US
1f540 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
1f550 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
1f560 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
1f570 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
1f580 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1f590 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f5a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1f5b0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1f5c0 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1f5d0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1f5e0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1f5f0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1f600 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f610 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1f620 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1f630 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1f640 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1f650 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1f660 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1f670 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1f680 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1f690 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1f6a0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f6b0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1f6c0 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1f6d0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1f6e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1f6f0 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1f700 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1f710 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f720 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1f730 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1f740 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1f750 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1f760 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1f770 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1f780 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f790 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1f7a0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1f7b0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1f7c0 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1f7d0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1f7e0 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1f7f0 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1f800 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1f810 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1f820 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1f830 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1f840 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1f850 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1f860 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1f870 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1f880 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1f890 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1f8a0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1f8b0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1f8c0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1f8d0 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1f8e0 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1f8f0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1f900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f910 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f920 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1f930 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f940 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1f950 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  CK );.  nPage = 
1f960 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1f970 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f980 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1f990 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e  abase size was n
1f9a0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
1f9b0 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1f9c0 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72  stem,.  ** deter
1f9d0 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e  mine it based on
1f9e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f9f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fa00 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  If the size.  **
1fa10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fa20 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20   file is not an 
1fa30 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1fa40 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1fa50 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f  e,.  ** round do
1fa60 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73  wn to the neares
1fa70 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20  t page. Except, 
1fa80 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20  any file larger 
1fa90 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65  than 0.  ** byte
1faa0 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
1fab0 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61  sidered to conta
1fac0 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
1fad0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1fae0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1faf0 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb10 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1fb20 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1fb30 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1fb40 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1fb50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1fb60 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1fb70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1fb80 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1fb90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1fba0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1fbb0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1fbc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fbd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1fbe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fbf0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1fc00 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
1fc10 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
1fc20 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1fc30 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1fc40 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1fc50 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1fc60 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1fc70 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1fc80 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1fc90 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1fca0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1fcb0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1fcc0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1fcd0 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1fce0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1fcf0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1fd00 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1fd10 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1fd20 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1fd30 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1fd40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fd50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fd60 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1fd70 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1fd80 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1fd90 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1fda0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1fdb0 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1fdc0 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1fdd0 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1fde0 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1fdf0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1fe00 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1fe10 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1fe20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1fe30 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1fe40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1fe50 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1fe60 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1fe70 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1fe80 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1fe90 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1fea0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1feb0 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1fec0 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1fed0 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1fee0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1fef0 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1ff00 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1ff10 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1ff20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1ff30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1ff40 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1ff50 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1ff60 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1ff70 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1ff80 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1ff90 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1ffa0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1ffb0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1ffc0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1ffd0 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1ffe0 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1fff0 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
20000 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
20010 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
20020 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
20030 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
20040 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
20050 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
20060 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
20070 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
20080 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
20090 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
200a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
200b0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
200c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
200d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
200e0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
200f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
20100 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
20110 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
20120 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
20130 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
20140 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
20150 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20170 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
20180 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
20190 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
201c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
201d0 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
201e0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
201f0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
20200 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20210 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
20220 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
20230 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
20240 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
20250 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
20260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20270 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
20280 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
20290 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
202a0 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
202b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
202c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
202d0 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
202e0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
202f0 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
20300 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
20310 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
20320 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20340 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
20350 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
20360 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
20370 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
20380 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
20390 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
203a0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
203b0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
203c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
203d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
203e0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
203f0 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
20400 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
20410 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
20420 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
20430 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
20440 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20450 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
20460 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
20470 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
20480 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
20490 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
204a0 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
204b0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
204c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
204d0 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
204e0 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
204f0 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
20500 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
20510 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
20520 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
20530 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
20540 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
20550 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
20560 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
20570 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
20580 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
20590 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
205a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
205b0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
205c0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
205d0 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
205e0 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
205f0 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
20600 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
20610 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
20620 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
20630 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20640 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
20650 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
20660 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
20670 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
20680 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
20690 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
206a0 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
206b0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
206c0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
206d0 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
206e0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
206f0 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
20700 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
20710 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20720 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
20730 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
20740 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
20750 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
20760 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
20770 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
20780 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
20790 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
207a0 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
207b0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
207c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
207d0 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
207e0 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
207f0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
20800 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
20810 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
20820 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
20830 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
20840 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20850 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
20860 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
20870 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
20880 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
20890 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
208a0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
208b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
208c0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
208d0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
208e0 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
208f0 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20900 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
20910 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
20920 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
20930 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
20940 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
20950 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
20960 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
20970 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
20980 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
20990 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
209a0 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
209b0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
209c0 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
209d0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
209e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
209f0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20a00 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
20a10 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
20a20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
20a30 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
20a40 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
20a50 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
20a60 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
20a70 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
20a80 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
20a90 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
20aa0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
20ab0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
20ac0 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
20ad0 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
20ae0 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
20af0 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
20b00 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
20b10 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
20b20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
20b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20b40 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
20b50 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
20b60 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
20b70 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
20b80 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
20b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20ba0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
20bb0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20bc0 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
20bd0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20be0 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
20bf0 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
20c00 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
20c10 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
20c20 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
20c30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20c40 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
20c50 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
20c60 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
20c70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
20c80 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
20c90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20ca0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
20cb0 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
20cc0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20cd0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
20ce0 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
20cf0 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
20d00 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
20d10 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
20d20 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
20d30 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20d40 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
20d50 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
20d60 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
20d70 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
20d80 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
20d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20da0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
20db0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
20dc0 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
20dd0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
20de0 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
20df0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
20e00 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
20e10 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
20e20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20e30 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
20e40 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20e50 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
20e60 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  igSize;.  pPager
20e70 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20e80 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
20e90 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53  File;..  if( !pS
20ea0 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65  avepoint && page
20eb0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20ec0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
20ed0 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70  gerRollbackWal(p
20ee0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
20ef0 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
20f00 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
20f10 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
20f20 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
20f30 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
20f40 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
20f50 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
20f60 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
20f70 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
20f80 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
20f90 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
20fa0 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
20fb0 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
20fc0 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
20fd0 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
20fe0 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
20ff0 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
21000 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
21010 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
21020 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
21030 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20  || szJ==0 );..  
21040 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
21050 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
21060 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
21070 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
21080 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
21090 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
210a0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
210b0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
210c0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
210d0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
210e0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
210f0 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
21100 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
21110 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
21120 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
21130 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
21140 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
21150 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
21160 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
21170 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
21180 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
21190 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
211a0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
211b0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
211c0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  pSavepoint && !p
211d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
211e0 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  r) ){.    iHdrOf
211f0 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
21200 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
21210 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
21220 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
21230 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21240 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
21250 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
21260 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
21270 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
21280 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
21290 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
212a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
212b0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
212c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
212d0 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
212e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
212f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21300 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
21310 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21320 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
21330 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
21340 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
21350 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
21360 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
21370 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
21380 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
21390 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
213a0 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
213b0 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
213c0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
213d0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
213e0 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
213f0 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
21400 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
21410 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
21420 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21430 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
21440 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21450 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
21460 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
21470 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
21480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21490 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
214a0 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
214b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
214c0 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
214d0 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
214e0 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
214f0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
21500 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  r, 0, szJ, &nJRe
21510 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
21520 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21530 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
21540 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
21550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21560 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
21570 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
21580 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
21590 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
215a0 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
215b0 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
215c0 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
215d0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
215e0 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
215f0 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
21600 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
21610 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52    */.    if( nJR
21620 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
21630 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21640 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
21650 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
21660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
21670 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
21680 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
21690 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
216a0 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
216b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
216c0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
216d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
216e0 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
216f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
21700 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
21710 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21720 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
21730 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
21740 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
21750 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
21760 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
21770 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
21780 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
21790 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
217a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
217b0 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
217c0 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
217d0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
217e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
217f0 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
21800 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
21810 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
21820 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21830 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
21840 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
21850 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
21860 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
21870 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
21880 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
21890 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
218a0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
218b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
218c0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
218d0 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
218e0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
218f0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
21900 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
21910 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21920 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
21930 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
21940 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
21950 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
21960 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
21970 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21980 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
21990 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
219a0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
219b0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
219c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
219d0 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69   offset==(i64)ii
219e0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
219f0 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
21a00 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21a10 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21a20 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
21a30 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
21a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21a50 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21a60 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
21a70 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
21a80 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
21a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
21aa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21ab0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
21ac0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21ad0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21ae0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21af0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
21b00 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
21b10 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
21b20 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21b30 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21b40 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21b50 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21b60 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
21b70 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
21b80 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
21b90 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
21ba0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
21bb0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
21bc0 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
21bd0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
21be0 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
21bf0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21c00 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
21c10 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
21c20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21c30 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
21c40 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
21c50 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
21c60 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
21c70 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
21c80 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
21c90 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
21ca0 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
21cb0 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
21cc0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
21cd0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
21ce0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
21cf0 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
21d00 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
21d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
21d20 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
21d30 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
21d40 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
21d50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21d60 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
21d70 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
21d80 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
21d90 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
21da0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
21db0 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
21dc0 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
21dd0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
21de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
21df0 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
21e00 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
21e10 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
21e20 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
21e30 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
21e40 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
21e50 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
21e60 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
21e70 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
21e80 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
21e90 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
21ea0 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
21eb0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
21ec0 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
21ed0 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
21ee0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
21ef0 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
21f00 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
21f10 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
21f20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
21f30 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
21f40 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
21f50 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
21f60 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
21f70 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
21f80 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
21f90 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
21fa0 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
21fb0 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
21fc0 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
21fd0 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
21fe0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
21ff0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22000 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
22010 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
22020 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
22030 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
22040 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
22050 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
22060 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
22070 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
22080 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
22090 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
220a0 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
220b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
220c0 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
220d0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
220e0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
220f0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
22100 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
22110 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
22120 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
22130 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
22150 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
22160 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
22170 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
22180 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22190 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
221a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
221b0 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
221c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
221d0 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
221e0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
221f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
22200 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
22210 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
22220 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
22230 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
22240 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22250 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
22260 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
22270 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
22280 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
22290 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
222a0 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
222b0 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
222d0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
222e0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
222f0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
22300 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
22310 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
22320 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
22330 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
22340 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
22350 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
22360 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
22370 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
22380 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
22390 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ack..**.** The a
223a0 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f  bove is for a ro
223b0 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d  llback-journal m
223c0 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f  ode.  For WAL mo
223d0 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65  de, OFF continue
223e0 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61  s.** to mean tha
223f0 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20  t no syncs ever 
22400 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d  occur.  NORMAL m
22410 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22420 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70  L is synced.** p
22430 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
22440 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20  t of checkpoint 
22450 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
22460 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79  abase file is sy
22470 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63  nced.** at the c
22480 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65  onclusion of the
22490 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74   checkpoint if t
224a0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
224b0 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20  t of the WAL.** 
224c0 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b  was written back
224d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
224e0 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63  se.  But no sync
224f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
22500 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69  r for.** an ordi
22510 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e  nary commit in N
22520 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20  ORMAL mode with 
22530 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73  WAL.  FULL means
22540 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a   that the WAL.**
22550 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
22560 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63  following each c
22570 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c  ommit operation,
22580 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   in addition to 
22590 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73  the.** syncs ass
225a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52  ociated with NOR
225b0 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  MAL..**.** Do no
225c0 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72  t confuse synchr
225d0 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20  onous=FULL with 
225e0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
225f0 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
22600 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f  _SYNC_FULL macro
22610 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68   means to use th
22620 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66  e MacOSX-style f
22630 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69  ull-fsync.** usi
22640 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46  ng fcntl(F_FULLF
22650 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53  SYNC).  SQLITE_S
22660 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  YNC_NORMAL means
22670 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64   to do an.** ord
22680 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61  inary fsync() ca
22690 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ll.  There is no
226a0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
226b0 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  een SQLITE_SYNC_
226c0 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  FULL.** and SQLI
226d0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
226e0 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65  n platforms othe
226f0 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20  r than MacOSX.  
22700 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68  But the.** synch
22710 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73  ronous=FULL vers
22720 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  us synchronous=N
22730 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65  ORMAL setting de
22740 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a  termines when.**
22750 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69   the xSync primi
22760 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tive is called a
22770 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74  nd is relevant t
22780 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e  o all platforms.
22790 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
227a0 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
227b0 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
227c0 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
227d0 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
227e0 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
227f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
22800 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
22810 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22820 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20  tFlags(.  Pager 
22830 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22840 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
22850 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c  set safety level
22860 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   for */.  unsign
22870 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
22880 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
22890 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
228a0 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67  d level = pgFlag
228b0 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
228c0 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73  ONOUS_MASK;.  as
228d0 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26  sert( level>=1 &
228e0 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20  & level<=3 );.  
228f0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22900 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
22910 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
22920 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
22930 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
22940 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
22950 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
22960 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22970 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
22980 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22990 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
229a0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
229b0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
229c0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
229d0 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20  FULLFSYNC ){.   
229e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
229f0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22a00 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
22a10 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22a20 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
22a30 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
22a40 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22a50 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20  _CKPT_FULLFSYNC 
22a60 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22a70 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22a80 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
22a90 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
22aa0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22ab0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
22ac0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22ad0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22ae0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22af0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22b00 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22b10 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22b20 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
22b30 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  walSyncFlags = p
22b40 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22b50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22b60 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
22b70 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
22b80 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43  lags |= WAL_SYNC
22b90 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
22ba0 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73   }.  if( pgFlags
22bb0 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50   & PAGER_CACHESP
22bc0 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ILL ){.    pPage
22bd0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
22be0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b   ~SPILLFLAG_OFF;
22bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22c00 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
22c10 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46   |= SPILLFLAG_OF
22c20 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  F;.  }.}.#endif.
22c30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
22c40 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
22c50 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
22c60 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
22c70 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
22c80 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
22c90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
22ca0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
22cb0 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
22cc0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22cd0 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
22ce0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22cf0 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
22d00 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
22d10 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
22d20 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
22d30 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
22d40 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
22d50 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
22d60 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
22d70 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
22d80 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
22d90 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
22da0 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
22db0 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
22dc0 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
22dd0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
22de0 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
22df0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
22e00 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
22e10 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
22e20 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
22e30 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
22e40 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
22e50 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
22e60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
22e70 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
22e80 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
22e90 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22ea0 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
22eb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22ec0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
22ed0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22ee0 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
22ef0 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
22f00 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
22f10 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
22f20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
22f30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
22f40 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
22f50 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
22f60 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
22f70 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
22f80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
22f90 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
22fa0 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
22fb0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
22fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22fd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
22fe0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22ff0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
23000 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
23010 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
23020 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
23030 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
23040 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
23050 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23060 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
23070 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
23080 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
23090 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
230a0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
230b0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
230c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
230d0 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
230e0 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
230f0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
23100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
23110 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
23120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23130 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
23140 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
23150 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
23160 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
23170 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
23180 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
23190 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
231a0 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
231b0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
231c0 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
231d0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
231e0 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
231f0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
23200 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
23210 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
23220 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
23230 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
23240 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
23250 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
23260 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
23270 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
23280 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
23290 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
232a0 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
232b0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
232c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
232d0 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
232e0 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
232f0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
23300 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
23310 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
23320 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
23330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
23360 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
23370 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
23380 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
23390 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
233a0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
233b0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
233c0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
233d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
233e0 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
233f0 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
23400 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
23410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
23420 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
23430 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
23440 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
23450 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
23460 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
23470 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
23480 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
23490 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
234a0 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
234b0 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
234c0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
234d0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
234e0 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
234f0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23510 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
23520 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
23530 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
23540 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
23550 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
23560 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
23570 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
23580 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
23590 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
235a0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
235b0 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
235c0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73  {.  pPager->xBus
235d0 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
235e0 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
235f0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
23600 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
23610 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f  rArg;..  if( isO
23620 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
23630 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70  ){.    void **ap
23640 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61   = (void **)&pPa
23650 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23660 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  r;.    assert( (
23670 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29  (int(*)(void *))
23680 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48  (ap[0]))==xBusyH
23690 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73  andler );.    as
236a0 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75  sert( ap[1]==pBu
236b0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a  syHandlerArg );.
236c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
236d0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
236e0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
236f0 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45  FCNTL_BUSYHANDLE
23700 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a  R, (void *)ap);.
23710 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
23720 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
23730 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
23740 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
23750 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
23760 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
23770 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
23780 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
23790 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
237a0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
237b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
237c0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
237d0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
237e0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
237f0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
23800 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
23810 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
23820 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
23830 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
23840 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
23850 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
23860 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
23870 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
23880 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
23890 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
238a0 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
238b0 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
238c0 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
238d0 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
238e0 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
238f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
23900 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
23910 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
23920 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
23930 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
23940 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
23950 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
23960 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
23970 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
23980 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
23990 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
239a0 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
239b0 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
239c0 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
239d0 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
239e0 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
239f0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
23a00 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
23a10 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
23a20 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
23a30 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23a40 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
23a50 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
23a60 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
23a70 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
23a80 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
23a90 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
23aa0 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
23ab0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
23ac0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
23ad0 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
23ae0 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
23af0 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
23b00 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23b10 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
23b20 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
23b30 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
23b40 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
23b50 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
23b60 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
23b70 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
23b80 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
23b90 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
23ba0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
23bb0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
23bc0 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
23bd0 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
23be0 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
23bf0 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
23c00 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
23c10 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
23c20 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
23c30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
23c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23c50 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
23c60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23c70 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
23c80 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
23c90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23ca0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
23cb0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
23cc0 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
23cd0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
23ce0 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
23cf0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
23d00 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
23d10 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
23d20 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
23d30 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
23d40 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
23d50 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
23d60 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
23d70 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
23d80 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
23d90 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
23da0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23db0 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
23dc0 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
23dd0 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
23de0 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
23df0 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
23e00 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
23e10 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
23e20 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
23e30 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
23e40 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
23e50 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
23e60 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
23e70 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
23e80 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
23e90 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
23ea0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
23eb0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
23ec0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
23ed0 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
23ee0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
23ef0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
23f00 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
23f10 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
23f20 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
23f30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
23f40 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
23f50 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
23f60 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
23f70 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23f90 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
23fa0 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
23fb0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
23fc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
23fd0 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
23fe0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
23ff0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24000 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
24010 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
24020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
24030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24040 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
24050 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
24060 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
24070 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
24080 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
24090 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
240a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
240b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
240c0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
240d0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
240e0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
240f0 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
24100 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
24110 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
24120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24140 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
24150 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
24160 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
24170 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
24180 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
24190 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
241a0 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
241b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
241c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
241d0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
241e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
241f0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
24200 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
24210 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
24220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
24230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24240 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
24250 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
24260 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
24270 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
24280 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
24290 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
242a0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
242b0 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
242c0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
242d0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
242e0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
242f0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
24300 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
24310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24320 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24330 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
24340 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
24350 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
24360 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
24370 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
24380 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
24390 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
243a0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
243b0 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
243c0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
243d0 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
243e0 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
243f0 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
24400 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
24410 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
24420 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
24430 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
24440 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
24450 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
24460 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
24470 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
24480 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
24490 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
244a0 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
244b0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
244c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
244d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
244e0 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
244f0 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
24500 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
24510 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
24520 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
24530 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
24540 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
24550 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
24560 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
24570 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
24580 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
24590 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
245a0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
245b0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
245c0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
245d0 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
245e0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
245f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
24600 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
24610 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
24620 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
24630 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
24640 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
24650 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
24660 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24670 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
24680 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
24690 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
246a0 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  gcnt */.  assert
246b0 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
246c0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  >=pPager->dbSize
246d0 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67   );  /* OP_MaxPg
246e0 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69  cnt enforces thi
246f0 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50  s */.  return pP
24700 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
24710 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
24720 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
24730 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
24740 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
24750 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
24760 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
24770 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
24780 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
24790 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
247a0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
247b0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
247c0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
247d0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
247e0 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
247f0 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
24800 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
24810 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
24820 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
24830 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
24840 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
24850 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24860 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
24870 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
24880 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
24890 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
248a0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
248b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
248c0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
248d0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
248e0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
248f0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
24900 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
24910 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
24920 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24930 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
24940 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24950 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
24960 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
24970 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
24980 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24990 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
249a0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
249b0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
249c0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
249d0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
249e0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
249f0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
24a00 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
24a10 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
24a20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
24a30 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
24a40 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
24a50 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
24a60 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
24a70 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
24a80 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
24a90 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
24aa0 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
24ab0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
24ac0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
24ad0 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
24ae0 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
24af0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
24b00 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
24b10 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
24b20 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
24b30 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
24b40 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
24b50 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
24b60 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
24b70 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
24b80 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
24b90 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
24ba0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
24bb0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
24bc0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
24bd0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
24be0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
24bf0 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
24c00 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
24c10 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
24c20 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
24c30 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
24c40 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
24c50 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
24c60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
24c70 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
24c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
24c90 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
24ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
24cb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24cc0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
24cd0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ile );..  /* Thi
24ce0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
24cf0 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65  y called by btre
24d00 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  e immediately af
24d10 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  ter creating.  *
24d20 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  * the Pager obje
24d30 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e  ct.  There has n
24d40 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72  ot been an oppor
24d50 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69  tunity to transi
24d60 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  tion.  ** to WAL
24d70 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a   mode yet..  */.
24d80 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
24d90 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
24da0 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
24db0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
24dc0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
24dd0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
24de0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
24df0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
24e00 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
24e10 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
24e20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
24e30 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
24e40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
24e50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24e60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24e70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24e80 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
24e90 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
24ea0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
24eb0 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20  n is open on.** 
24ec0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65  the pager. It re
24ed0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
24ee0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
24ef0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
24f00 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
24f10 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
24f20 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
24f30 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
24f40 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
24f50 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
24f60 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
24f70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
24f80 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
24f90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24fa0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
24fb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24fc0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
24fd0 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
24fe0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24ff0 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
25000 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
25010 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
25020 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a  er->dbSize;.}...
25030 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
25040 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
25050 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
25060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25070 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
25080 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
25090 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
250a0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
250b0 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
250c0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
250d0 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
250e0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
250f0 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
25100 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
25110 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
25120 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
25130 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
25140 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
25150 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
25160 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
25170 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
25180 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
25190 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
251a0 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
251b0 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
251c0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
251d0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
251e0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
251f0 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
25200 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
25210 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
25220 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
25230 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
25240 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
25250 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
25260 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
25270 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
25280 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
25290 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
252a0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
252b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
252c0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
252d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25300 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
25310 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
25320 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
25330 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
25340 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
25350 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f  already held), o
25360 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
25370 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68  nsitions that th
25380 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
25390 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
253a0 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
253b0 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
253c0 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
253d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
253e0 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
253f0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
25400 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b  ger->eLock>=lock
25410 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
25420 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
25430 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  NO_LOCK && lockt
25440 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
25450 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
25460 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45  ger->eLock==RESE
25470 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  RVED_LOCK && loc
25480 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
25490 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64  _LOCK).  );..  d
254a0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  o {.    rc = pag
254b0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
254c0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77   locktype);.  }w
254d0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
254e0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
254f0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
25500 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
25510 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75  erArg) );.  retu
25520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25530 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
25540 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25550 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
25560 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
25570 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
25580 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
25590 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
255a0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
255b0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
255c0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
255d0 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
255e0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
255f0 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
25600 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
25610 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
25620 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
25630 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
25640 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
25650 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
25660 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
25670 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
25680 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
25690 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
256a0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
256b0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
256c0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
256d0 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
256e0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
256f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25700 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
25710 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
25720 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
25730 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
25740 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
25750 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
25760 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
25770 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
25780 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
25790 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
257a0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
257b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
257c0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
257d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
257e0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
257f0 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
25800 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
25810 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
25820 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
25830 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20  havior would be 
25840 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
25850 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
25860 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
25870 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
25880 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
25890 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
258a0 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
258b0 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
258c0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
258d0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
258e0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
258f0 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
25900 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
25910 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
25920 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
25930 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
25940 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
25950 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
25960 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
25970 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
25980 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
25990 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
259a0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
259b0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
259c0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
259d0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
259e0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
259f0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
25a00 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
25a10 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
25a20 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
25a30 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
25a40 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
25a50 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
25a60 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25a70 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
25a80 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
25a90 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
25aa0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
25ab0 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
25ac0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
25ad0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
25ae0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
25af0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
25b00 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
25b10 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
25b20 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
25b30 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
25b40 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
25b50 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
25b60 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
25b70 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
25b80 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
25b90 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
25ba0 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
25bb0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
25bc0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
25bd0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
25be0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
25bf0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
25c00 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
25c10 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
25c20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25c30 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25c40 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
25c50 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
25c60 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74  ction..** Once t
25c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
25c80 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
25c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
25ca0 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20  st either be.** 
25cb0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63  rolled back or c
25cc0 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20  ommitted. It is 
25cd0 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c  not safe to call
25ce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
25cf0 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69  nd.** then conti
25d00 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  nue writing to t
25d10 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
25d20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25d30 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
25d40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
25d50 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
25d60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
25d70 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
25d80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25d90 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
25da0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
25db0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
25dc0 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a  e = nPage;..  /*
25dd0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
25de0 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c  e code here call
25df0 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ed assertTruncat
25e00 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f  eConstraint() to
25e10 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
25e20 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e  t all pages bein
25e30 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79  g truncated away
25e40 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
25e50 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20  on are,.  ** if 
25e60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
25e70 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c  points are open,
25e80 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
25e90 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
25ea0 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
25eb0 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
25ec0 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65  ored if the save
25ed0 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a  point is rolled.
25ee0 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20    ** back. This 
25ef0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63  is no longer nec
25f00 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66  essary as this f
25f10 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f  unction is now o
25f20 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20  nly.  ** called 
25f30 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
25f40 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
25f50 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75  ction. So althou
25f60 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  gh the .  ** Pag
25f70 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74  er object may st
25f80 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61  ill have open sa
25f90 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e  vepoints (Pager.
25fa0 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20  nSavepoint!=0), 
25fb0 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f  .  ** they canno
25fc0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
25fd0 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54  . So the assertT
25fe0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25ff0 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73  t() call.  ** is
26000 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65   no longer corre
26010 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ct. */.}.../*.**
26020 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26030 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
26040 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
26050 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
26060 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
26070 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26080 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
26090 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
260a0 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
260b0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
260c0 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
260d0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
260e0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
260f0 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
26100 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
26110 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
26120 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
26130 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
26140 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
26150 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
26160 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
26170 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
26180 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
26190 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
261a0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
261b0 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
261c0 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
261d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
261e0 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
261f0 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
26200 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
26210 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
26220 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
26230 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
26240 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
26250 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
26260 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
26270 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
26280 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26290 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
262a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
262b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
262c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
262d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
262e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
262f0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
26300 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
26310 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
26320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26330 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26340 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
26350 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
26360 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
26370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ;.}../*.** Obtai
26390 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
263a0 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64   a memory mapped
263b0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72   page object for
263c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
263d0 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  o. .** The new o
263e0 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74  bject will use t
263f0 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61  he pointer pData
26400 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  , obtained from 
26410 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20  xFetch()..** If 
26420 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
26430 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  *ppPage to point
26440 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
26450 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e   reference.** an
26460 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
26470 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  OK. Otherwise, r
26480 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
26490 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
264a0 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f  et.** *ppPage to
264b0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67   zero..**.** Pag
264c0 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74  e references obt
264d0 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
264e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
264f0 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65  hould be release
26500 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
26510 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26520 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
26530 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
26540 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65  eMapPage(.  Page
26550 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
26560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26570 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
26580 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
265b0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  */.  void *pData
265c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
265d0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29       /* xFetch()
265e0 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  'd data for this
265f0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
26600 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20   **ppPage       
26610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26620 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65  T: Acquired page
26630 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
26640 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26660 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
26670 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20   page to return 
26680 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
26690 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
266a0 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
266b0 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d   p = pPager->pMm
266c0 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  apFreelist;.    
266d0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
266e0 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74  elist = p->pDirt
266f0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
26700 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
26710 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70  (p->pExtra, 0, p
26720 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
26730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
26740 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64  Page = p = (PgHd
26750 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
26760 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48  cZero(sizeof(PgH
26770 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  dr) + pPager->nE
26780 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70  xtra);.    if( p
26790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
267a0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
267b0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
267c0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
267d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
267e0 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
267f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26800 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74     }.    p->pExt
26810 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  ra = (void *)&p[
26820 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  1];.    p->flags
26830 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20   = PGHDR_MMAP;. 
26840 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
26850 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20      p->pPager = 
26860 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61  pPager;.  }..  a
26870 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61  ssert( p->pExtra
26880 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20  ==(void *)&p[1] 
26890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
268a0 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73  pPage==0 );.  as
268b0 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d  sert( p->flags==
268c0 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20  PGHDR_MMAP );.  
268d0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
268e0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
268f0 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
26900 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20  1 );..  p->pgno 
26910 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61  = pgno;.  p->pDa
26920 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50  ta = pData;.  pP
26930 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b  ager->nMmapOut++
26940 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
26950 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26960 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
26970 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e  nce to page pPg.
26980 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62   pPg must have b
26990 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  een returned by 
269a0 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63  an .** earlier c
269b0 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75  all to pagerAcqu
269c0 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  ireMapPage()..*/
269d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
269e0 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
269f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26a00 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
26a10 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  pPg->pPager;.  p
26a20 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d  Pager->nMmapOut-
26a30 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  -;.  pPg->pDirty
26a40 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26a50 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67  Freelist;.  pPag
26a60 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26a70 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65  t = pPg;..  asse
26a80 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  rt( pPager->fd->
26a90 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
26aa0 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74  on>=3 );.  sqlit
26ab0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26ac0 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50  er->fd, (i64)(pP
26ad0 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  g->pgno-1)*pPage
26ae0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67  r->pageSize, pPg
26af0 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pData);.}../*.
26b00 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64  ** Free all PgHd
26b10 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64  r objects stored
26b20 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d   in the Pager.pM
26b30 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74  mapFreelist list
26b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b50 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
26b60 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
26b70 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
26b80 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20  PgHdr *pNext;.  
26b90 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d  for(p=pPager->pM
26ba0 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20  mapFreelist; p; 
26bb0 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
26bc0 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ext = p->pDirty;
26bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26be0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  e(p);.  }.}.../*
26bf0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
26c00 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
26c10 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
26c20 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
26c30 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
26c40 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
26c50 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
26c60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
26c70 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
26c80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
26c90 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
26ca0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
26cb0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
26cc0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
26cd0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
26ce0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
26cf0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
26d00 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
26d10 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
26d20 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
26d30 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
26d40 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
26d50 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
26d60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26d70 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
26d80 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
26d90 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
26da0 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
26db0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
26dc0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
26dd0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
26de0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
26df0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
26e00 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
26e10 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
26e20 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
26e30 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
26e40 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
26e50 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
26e60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26e70 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
26e80 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
26e90 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74  Space;..  assert
26ea0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
26eb0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
26ec0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
26ed0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
26ee0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
26ef0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
26f00 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
26f10 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  s(pPager);.  /* 
26f20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
26f30 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
26f40 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
26f50 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
26f60 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
26f70 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
26f80 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
26f90 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
26fa0 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
26fb0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 70 50  r->pageSize, (pP
26fc0 61 67 65 72 2d 3e 6f 74 61 4d 6f 64 65 3f 30 3a  ager->otaMode?0:
26fd0 70 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50 61  pTmp).  );.  pPa
26fe0 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
26ff0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
27000 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
27010 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
27020 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
27030 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
27040 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
27050 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
27060 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
27070 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
27080 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
27090 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
270a0 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
270b0 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
270c0 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
270d0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
270e0 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
270f0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
27100 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
27110 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
27120 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
27130 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
27140 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
27150 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
27160 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
27170 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
27180 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
27190 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
271a0 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
271b0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
271c0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
271d0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
271e0 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
271f0 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
27200 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
27210 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
27220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
27230 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
27240 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
27250 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
27260 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
27270 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
27280 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
27290 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
272a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
272b0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
272c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
272d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
272e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
272f0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
27300 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
27310 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
27320 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
27330 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
27340 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
27350 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
27360 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
27370 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
27380 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
27390 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
273a0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
273b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
273c0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
273d0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
273e0 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
273f0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27400 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
27410 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27420 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
27430 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
27440 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
27450 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
27460 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
27470 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
27480 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
27490 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
274a0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
274b0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
274c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
274d0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
274e0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
274f0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
27500 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
27510 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
27520 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
27530 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
27540 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
27550 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27560 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
27570 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
27580 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
27590 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
275a0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
275b0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
275c0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
275d0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
275e0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
275f0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
27600 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27610 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
27620 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
27630 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
27640 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27650 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
27660 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27670 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27680 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27690 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
276a0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
276b0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
276c0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
276d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
276e0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
276f0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
27700 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
27710 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
27720 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
27730 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
27740 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27750 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
27760 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27770 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27790 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
277a0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
277b0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
277c0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
277d0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
277e0 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
277f0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
27800 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
27810 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
27820 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
27830 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
27840 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
27850 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
27860 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
27870 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
27880 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27890 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
278a0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
278b0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
278c0 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
278d0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
278e0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
278f0 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
27900 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
27910 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
27920 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
27930 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
27940 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
27950 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
27960 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
27970 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
27980 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
27990 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
279a0 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
279b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
279c0 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
279d0 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
279e0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
279f0 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
27a00 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27a10 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
27a20 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
27a30 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
27a40 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
27a50 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
27a60 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
27a70 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
27a80 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
27a90 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
27aa0 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27ab0 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27ac0 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
27ad0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27ae0 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
27af0 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
27b00 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
27b10 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
27b20 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
27b30 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
27b40 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
27b50 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
27b60 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
27b70 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27b80 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
27b90 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
27ba0 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
27bb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27bc0 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
27bd0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
27be0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
27bf0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
27c00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27c10 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
27c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
27c30 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
27c40 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
27c50 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
27c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27c80 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
27c90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27ca0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27cb0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
27cc0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
27cd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27ce0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
27cf0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
27d00 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
27d10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27d20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27d30 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
27d40 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
27d50 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
27d60 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27d70 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27d80 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
27d90 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
27da0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27db0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
27dc0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27dd0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
27de0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27df0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27e00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
27e10 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
27e20 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
27e30 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
27e40 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
27e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27e60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27e70 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
27e80 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
27e90 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
27ea0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
27eb0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
27ec0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
27ed0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
27ee0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
27ef0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
27f00 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
27f10 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
27f20 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
27f30 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
27f40 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
27f50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27f60 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
27f70 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
27f80 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
27f90 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
27fa0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
27fb0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
27fc0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
27fd0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
27fe0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
27ff0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
28000 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
28010 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
28020 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
28030 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
28040 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
28050 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
28060 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
28070 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
28080 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
28090 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
280a0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
280b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
280c0 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
280d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
280e0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
280f0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
28100 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
28110 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
28120 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
28130 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
28140 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
28150 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
28160 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
28170 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
28180 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
28190 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
281a0 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
281b0 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
281c0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
281d0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
281e0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
281f0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
28200 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
28210 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
28220 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
28230 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
28240 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
28250 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
28260 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
28270 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
28280 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
28290 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
282a0 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
282b0 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
282c0 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
282d0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
282e0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
282f0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
28300 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28310 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
28320 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
28330 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
28340 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
28350 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
28360 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
28370 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
28380 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
28390 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
283a0 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
283b0 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
283c0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
283d0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
283e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
283f0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
28400 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
28410 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
28420 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
28430 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
28440 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
28450 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
28460 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
28470 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
28480 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
28490 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
284a0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
284b0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
284c0 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
284d0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
284e0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
284f0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
28500 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
28510 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
28520 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28540 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
28550 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
28560 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28570 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28580 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
28590 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
285a0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
285b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
285c0 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
285d0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
285e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
285f0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28600 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
28610 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
28620 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
28630 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28640 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
28650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
28660 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28670 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28680 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28690 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
286a0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
286b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
286c0 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
286d0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
286e0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
286f0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28700 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
28710 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
28720 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
28730 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
28740 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
28750 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
28760 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28770 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28780 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28790 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
287a0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
287b0 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
287c0 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
287d0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
287e0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
287f0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
28800 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
28810 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
28820 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
28830 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
28840 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
28850 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
28860 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
28870 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
28880 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
28890 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
288a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
288b0 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
288c0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
288d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
288e0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
288f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28900 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
28910 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28920 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28930 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
28940 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
28950 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
28960 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28970 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
28980 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28990 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
289a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
289b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
289c0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
289d0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
289e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
289f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28a00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
28a10 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28a20 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
28a30 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
28a40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
28a50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28a60 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
28a70 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28a80 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
28a90 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
28aa0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28ab0 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28ac0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28ae0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28af0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
28b00 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
28b10 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
28b20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28b30 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28b40 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28b50 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28b60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
28b70 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
28b80 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
28b90 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28ba0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28bb0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
28bc0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
28bd0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
28be0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
28bf0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
28c00 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
28c10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28c20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28c30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28c40 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
28c50 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
28c60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28c70 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
28c80 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
28c90 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
28ca0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
28cb0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
28cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
28cd0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
28ce0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28cf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28d00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28d20 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
28d30 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28d50 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
28d60 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
28d70 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
28d80 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
28d90 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
28da0 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
28db0 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
28dc0 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
28dd0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
28de0 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
28df0 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
28e00 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
28e10 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
28e20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
28e30 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
28e40 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
28e50 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
28e60 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
28e70 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
28e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28e90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
28ea0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
28eb0 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
28ec0 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
28ed0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
28ee0 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
28ef0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
28f00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
28f10 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
28f20 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
28f30 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
28f40 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
28f50 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
28f60 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
28f70 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
28f80 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
28f90 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
28fa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28fb0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
28fc0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
28fd0 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
28fe0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
28ff0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
29000 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
29010 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
29020 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
29030 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
29040 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
29050 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
29060 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
29070 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
29080 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
29090 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
290a0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
290b0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
290c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
290d0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
290e0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
290f0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
29100 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
29110 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
29120 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
29130 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
29140 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
29150 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
29160 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
29170 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
29180 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
29190 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
291a0 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
291b0 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
291c0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
291d0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
291e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
291f0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
29200 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
29210 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
29220 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
29230 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
29240 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
29250 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
29260 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
29270 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
29280 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
29290 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
292a0 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
292b0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
292c0 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
292d0 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
292e0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
292f0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
29300 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
29310 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
29320 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
29330 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
29340 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
29350 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
29360 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
29370 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
29380 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
29390 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
293a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
293b0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
293c0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
293d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
293e0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
293f0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
29400 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29410 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
29420 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
29430 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
29440 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
29450 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
29460 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29470 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
29480 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
29490 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
294a0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
294b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
294e0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
294f0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
29500 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
29510 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
29520 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
29530 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
29540 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29550 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29560 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29570 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
29580 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29590 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
295a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
295b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
295c0 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
295d0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
295e0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
295f0 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
29600 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
29610 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
29620 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
29630 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
29640 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
29650 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
29660 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
29670 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
29680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
29690 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
296a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
296b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
296c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
296d0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
296e0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
296f0 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
29700 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
29710 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
29720 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
29730 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
29740 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
29750 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
29760 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
29770 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
29780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29790 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
297a0 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
297b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
297c0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69   && pPager->dbHi
297d0 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  ntSize<pPager->d
297e0 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69  bSize.   && (pLi
297f0 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c  st->pDirty || pL
29800 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  ist->pgno>pPager
29810 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20  ->dbHintSize).  
29820 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
29830 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
29840 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
29850 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
29860 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
29870 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
29880 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
29890 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
298a0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
298b0 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
298c0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
298d0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
298e0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
298f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29900 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
29910 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
29920 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
29930 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
29940 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
29950 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
29960 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
29970 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
29980 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
29990 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
299a0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
299b0 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
299c0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
299d0 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
299e0 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
299f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
29a00 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
29a10 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
29a20 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
29a30 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
29a40 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
29a50 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
29a60 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
29a70 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
29a80 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
29a90 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
29aa0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
29ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29ac0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
29ad0 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
29ae0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
29af0 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
29b00 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
29b10 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
29b20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29b30 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
29b40 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
29b50 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b80 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
29b90 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
29ba0 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
29bb0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29bc0 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
29bd0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
29be0 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
29bf0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
29c00 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
29c10 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
29c20 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
29c30 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
29c40 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
29c50 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
29c60 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
29c70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
29c80 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
29c90 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
29ca0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29cb0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
29cc0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
29cd0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
29ce0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
29cf0 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
29d00 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
29d10 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
29d20 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
29d30 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
29d40 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
29d50 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
29d60 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
29d70 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
29d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29d90 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
29da0 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
29db0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29dc0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
29dd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
29de0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
29df0 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
29e00 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
29e10 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
29e20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
29e30 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
29e40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
29e50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29e60 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
29e70 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
29e80 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
29e90 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
29ea0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
29eb0 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
29ec0 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
29ed0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
29ee0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
29ef0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
29f00 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
29f10 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
29f20 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
29f30 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29f40 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
29f50 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f70 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29f80 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
29f90 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
29fa0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
29fb0 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
29fc0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
29fd0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
29fe0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
29ff0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
2a000 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a010 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a020 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
2a030 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a040 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
2a050 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
2a060 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
2a070 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
2a080 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2a090 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2a0a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
2a0b0 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
2a0c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2a0d0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
2a0e0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
2a0f0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
2a100 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2a110 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2a120 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
2a130 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
2a140 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
2a150 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
2a160 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
2a170 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2a180 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2a190 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
2a1a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2a1b0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2a1c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2a1d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a1e0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
2a1f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a200 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
2a210 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2a220 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2a230 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
2a240 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
2a250 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
2a260 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
2a270 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
2a280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a290 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2a2a0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
2a2b0 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
2a2c0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2a2d0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
2a2e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a2f0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
2a300 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
2a310 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
2a320 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
2a330 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
2a340 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
2a350 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
2a360 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
2a370 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
2a380 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
2a390 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
2a3a0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
2a3b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2a3c0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2a3d0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2a3e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2a3f0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2a400 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2a410 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2a420 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2a430 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2a440 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a450 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2a460 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2a470 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2a480 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2a490 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2a4a0 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2a4b0 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2a4c0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2a4d0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2a4e0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2a4f0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2a500 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2a510 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2a520 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2a530 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2a540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a550 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2a560 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2a570 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2a580 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2a590 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a5a0 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2a5b0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2a5c0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2a5d0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2a5e0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2a5f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2a600 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2a610 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a620 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2a630 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a640 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2a650 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a660 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2a670 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2a680 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2a690 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2a6a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2a6b0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2a6c0 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2a6d0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2a6e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2a6f0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2a700 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2a710 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2a720 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2a730 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2a740 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2a750 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2a760 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2a770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2a780 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2a790 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2a7a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a7b0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2a7c0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2a7d0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2a7e0 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2a7f0 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2a800 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2a810 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2a820 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2a830 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2a840 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2a850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a860 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
2a870 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a880 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
2a890 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2a8a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2a8b0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a8c0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2a8d0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
2a8e0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
2a8f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a910 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a920 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a930 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
2a940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a950 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
2a960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a980 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
2a990 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
2a9a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a9b0 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
2a9c0 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
2a9d0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2a9e0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2a9f0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2aa00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2aa10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2aa20 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2aa30 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2aa40 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2aa50 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2aa60 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2aa70 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2aa80 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2aa90 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2aaa0 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2aab0 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2aac0 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2aad0 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2aae0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2aaf0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2ab00 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2ab10 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2ab20 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2ab30 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2ab40 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2ab50 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2ab60 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2ab70 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2ab80 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2ab90 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2aba0 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2abb0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2abc0 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2abd0 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2abe0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2abf0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2ac00 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2ac10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2ac20 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2ac30 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2ac40 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2ac50 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2ac60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2ac70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2ac80 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2ac90 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2aca0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2acb0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2acc0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2acd0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2ace0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2acf0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2ad00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2ad10 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2ad20 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2ad30 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2ad40 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2ad50 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2ad60 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2ad70 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2ad80 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2ad90 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2ada0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2adb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2adc0 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2add0 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2ade0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2adf0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2ae00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ae10 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2ae20 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2ae30 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2ae40 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ae50 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2ae60 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2ae70 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2ae80 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2ae90 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2aea0 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2aeb0 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2aec0 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2aed0 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2aee0 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2aef0 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2af00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2af10 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2af20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2af30 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2af40 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2af50 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2af60 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2af70 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2af80 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2af90 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2afa0 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2afb0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2afc0 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2afd0 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2afe0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2aff0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2b000 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2b010 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2b020 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2b030 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2b040 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2b050 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2b060 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2b070 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2b080 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2b090 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2b0a0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2b0b0 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2b0c0 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2b0d0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2b0e0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2b0f0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2b100 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2b110 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2b120 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2b130 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2b140 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2b150 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2b160 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2b170 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2b180 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2b190 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2b1a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2b1b0 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2b1c0 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2b1d0 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2b1e0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2b1f0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2b200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2b210 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b220 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b230 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2b240 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b250 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b260 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2b270 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2b280 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b290 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b2a0 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2b2b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b2c0 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2b2d0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b2e0 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2b2f0 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2b300 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2b310 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2b320 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2b330 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2b340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b350 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
2b360 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
2b370 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2b380 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
2b390 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2b3a0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2b3b0 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2b3c0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2b3d0 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
2b3e0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
2b3f0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
2b400 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b420 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2b430 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2b440 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2b450 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20   }.  }else{.  . 
2b460 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2b470 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2b480 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2b490 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2b4a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2b4b0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2b4c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2b4d0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2b4e0 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2b4f0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2b500 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2b510 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
2b520 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2b530 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
2b540 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
2b550 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a  nt size of.    *
2b560 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
2b570 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65  mage, it may nee
2b580 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  d to be written 
2b590 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2b5a0 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  al..    ** This 
2b5b0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
2b5c0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
2b5d0 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
2b5e0 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
2b5f0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
2b600 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
2b610 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
2b620 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b630 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
2b640 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
2b650 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a  of events:.    *
2b660 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e  *.    **   BEGIN
2b670 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  ;.    **     <jo
2b680 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
2b690 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79    **     <modify
2b6a0 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
2b6b0 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
2b6c0 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c  ;.    **       <
2b6d0 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
2b6e0 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
2b6f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61  .    **       pa
2b700 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
2b710 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c  ).    **     ROL
2b720 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
2b730 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58   **.    ** If (X
2b740 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
2b750 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
2b760 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
2b770 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
2b780 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68      ** out to th
2b790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2b7a0 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
2b7b0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
2b7c0 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a  che. Then,.    *
2b7d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
2b7e0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
2b7f0 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64   statement, read
2b800 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20  ing page X will 
2b810 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61  read.    ** data
2b820 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2b830 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
2b840 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
2b850 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
2b860 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74     ** was when t
2b870 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
2b880 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
2b890 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
2b8a0 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a  POINT sp".    **
2b8b0 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
2b8c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2b8d0 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
2b8e0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
2b8f0 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  t data for page 
2b900 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  X into the .    
2b910 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
2b920 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
2b930 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
2b940 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
2b950 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2b960 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
2b970 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
2b980 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
2b990 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20   TO sp" is .    
2b9a0 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  ** executed..   
2b9b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
2b9c0 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  R(.        rc==S
2b9d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
2b9e0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2b9f0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
2ba00 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
2ba10 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20    ) ){.      rc 
2ba20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2ba30 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  (pPg);.    }.  .
2ba40 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2ba50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ba60 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
2ba70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2ba80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2ba90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2baa0 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
2bab0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2bac0 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
2bad0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
2bae0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
2baf0 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d  ger, pPg);.    }
2bb00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
2bb10 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2bb20 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
2bb30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bb40 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2bb50 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
2bb60 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2bb70 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2bb80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
2bb90 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
2bba0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2bbb0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2bbc0 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f  ger, rc); .}.../
2bbd0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
2bbe0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
2bbf0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
2bc00 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
2bc10 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
2bc20 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
2bc30 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
2bc40 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
2bc50 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
2bc60 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2bc70 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
2bc80 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
2bc90 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
2bca0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2bcb0 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
2bcc0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2bcd0 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
2bce0 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
2bcf0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
2bd00 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
2bd10 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
2bd20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
2bd30 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
2bd40 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
2bd50 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
2bd60 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
2bd70 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2bd80 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
2bd90 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
2bda0 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
2bdb0 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
2bdc0 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
2bdd0 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
2bde0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
2bdf0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
2be00 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
2be10 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2be20 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2be30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2be40 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2be50 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2be60 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2be70 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2be80 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2be90 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2bea0 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2beb0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2bec0 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
2bed0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2bee0 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
2bef0 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
2bf00 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
2bf10 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
2bf20 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
2bf30 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
2bf40 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
2bf50 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
2bf60 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a  PAGER_* flags..*
2bf70 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
2bf80 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
2bf90 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
2bfa0 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
2bfb0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
2bfc0 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
2bfd0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
2bfe0 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
2bff0 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
2c000 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
2c010 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
2c020 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
2c030 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
2c040 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
2c050 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c060 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
2c070 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
2c080 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
2c090 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
2c0a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2c0b0 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
2c0c0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
2c0d0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
2c0e0 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
2c0f0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2c100 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
2c110 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
2c120 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
2c130 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
2c140 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
2c150 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
2c160 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
2c170 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2c180 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
2c190 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2c1a0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2c1b0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
2c1c0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
2c1d0 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
2c1e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
2c1f0 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
2c200 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2c210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2c220 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
2c230 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2c240 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
2c250 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c270 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
2c280 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
2c290 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2c2a0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2c2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2c2c0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
2c2d0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
2c2e0 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
2c2f0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
2c300 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
2c310 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
2c320 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
2c330 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
2c340 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
2c350 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
2c360 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
2c370 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
2c380 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
2c390 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2c3a0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
2c3b0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
2c3c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c3d0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
2c3e0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
2c3f0 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
2c400 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2c410 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
2c420 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
2c430 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
2c440 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2c450 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c460 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2c470 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
2c480 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
2c490 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c4a0 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
2c4b0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
2c4c0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c4d0 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
2c4e0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
2c4f0 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
2c500 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
2c510 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
2c520 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
2c530 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2c540 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
2c550 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
2c560 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2c570 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
2c580 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
2c590 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
2c5a0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
2c5b0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
2c5c0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
2c5d0 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
2c5e0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2c5f0 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
2c600 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2c610 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
2c620 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  32 szPageDflt = 
2c630 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2c640 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
2c650 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2c660 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2c670 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a  *zUri = 0;    /*
2c680 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70   URI args to cop
2c690 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20  y */.  int nUri 
2c6a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2c6b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2c6c0 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61  es of URI args a
2c6d0 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a  t *zUri */..  /*
2c6e0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
2c6f0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
2c700 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
2c710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2c720 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
2c730 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
2c740 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
2c750 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
2c760 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
2c770 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
2c780 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
2c790 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2c7a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2c7b0 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
2c7c0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
2c7d0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
2c7e0 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
2c7f0 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
2c800 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
2c810 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
2c820 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
2c830 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
2c840 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
2c850 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
2c860 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2c870 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2c880 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
2c890 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
2c8a0 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
2c8b0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
2c8c0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c8d0 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
2c8e0 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
2c8f0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c900 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c910 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2c920 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
2c930 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2c940 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2c950 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2c960 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
2c970 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2c980 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2c990 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2c9a0 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2c9b0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2c9c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c9d0 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2c9e0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2c9f0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2ca00 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2ca10 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2ca20 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2ca30 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2ca40 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2ca50 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2ca60 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2ca70 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2ca80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ca90 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2caa0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2cab0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2cac0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2cad0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2cae0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2caf0 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2cb00 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2cb10 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2cb20 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2cb30 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2cb40 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2cb50 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2cb60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2cb70 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2cb80 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2cb90 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2cba0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2cbb0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2cbc0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2cbd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2cbe0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2cbf0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2cc00 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2cc10 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2cc20 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2cc30 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2cc40 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2cc50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2cc60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2cc70 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
2cc80 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
2cc90 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
2cca0 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
2ccb0 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
2ccc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2ccd0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
2cce0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
2ccf0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
2cd00 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e  ame);.    nPathn
2cd10 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2cd20 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2cd30 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d  ;.    z = zUri =
2cd40 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69   &zFilename[sqli
2cd50 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
2cd60 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77  ename)+1];.    w
2cd70 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
2cd80 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2cd90 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2cda0 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2cdb0 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2cdc0 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28    }.    nUri = (
2cdd0 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72  int)(&z[1] - zUr
2cde0 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i);.    assert( 
2cdf0 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nUri>=0 );.    i
2ce00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ce10 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
2ce20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ce30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2ce40 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2ce50 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
2ce60 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
2ce70 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
2ce80 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
2ce90 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
2cea0 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
2ceb0 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
2cec0 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
2ced0 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
2cee0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
2cef0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
2cf00 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
2cf10 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
2cf20 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
2cf30 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
2cf40 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
2cf50 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
2cf60 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
2cf70 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
2cf80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2cf90 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2cfa0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2cfb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cfc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2cfd0 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2cfe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2cff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2d000 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
2d010 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
2d020 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
2d030 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
2d040 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
2d050 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
2d060 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2d070 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
2d080 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
2d090 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
2d0a0 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
2d0b0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
2d0c0 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0e0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
2d0f0 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
2d100 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d120 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
2d130 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
2d140 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2d150 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d160 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
2d170 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
2d180 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
2d190 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d1a0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2d1b0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2d1c0 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
2d1d0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2d1e0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
2d1f0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2d200 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2d210 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
2d220 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2d230 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
2d240 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
2d250 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2d260 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2d270 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
2d280 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
2d290 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2d2a0 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
2d2b0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
2d2c0 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
2d2d0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
2d2e0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2d2f0 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
2d300 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
2d310 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2d320 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
2d330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2d340 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
2d350 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2d360 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
2d370 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
2d380 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
2d390 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
2d3a0 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20  + nUri +        
2d3b0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
2d3c0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d3d0 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   8 + 2          
2d3e0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
2d3f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2d400 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b  E_OMIT_WAL.    +
2d410 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b   nPathname + 4 +
2d420 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   2            /*
2d430 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   zWal */.#endif.
2d440 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
2d450 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2d460 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
2d470 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
2d480 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
2d490 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
2d4a0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2d4b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
2d4c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d4d0 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
2d4e0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2d4f0 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
2d500 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
2d510 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
2d520 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d530 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2d540 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
2d550 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
2d560 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d570 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
2d580 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
2d590 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
2d5a0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d5b0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2d5c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
2d5d0 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
2d5e0 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
2d5f0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2d600 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d610 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
2d620 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2d630 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
2d640 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2d650 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
2d660 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
2d670 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
2d680 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
2d690 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
2d6a0 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
2d6b0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
2d6c0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  hname ){.    ass
2d6d0 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30  ert( nPathname>0
2d6e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2d6f0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2d700 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2d710 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2d720 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2d730 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d740 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d750 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
2d760 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26   nUri ) memcpy(&
2d770 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d780 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20  e[nPathname+1], 
2d790 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
2d7a0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d7b0 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
2d7c0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2d7d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2d7e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2d7f0 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
2d800 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a  nal\000", 8+2);.
2d810 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d820 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d830 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d840 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66  ->zJournal);.#if
2d850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d860 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d  _WAL.    pPager-
2d870 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
2d880 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2d890 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65  ame+8+1];.    me
2d8a0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2d8b0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2d8c0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2d8d0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2d8e0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2d8f0 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b  -wal\000", 4+1);
2d900 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2d910 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2d920 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d930 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66  r->zWal);.#endif
2d940 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2d950 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2d960 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
2d970 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2d980 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
2d990 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
2d9a0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
2d9b0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2d9c0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2d9d0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2d9e0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da00 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
2da10 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
2da20 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
2da30 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2da40 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
2da50 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2da60 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
2da70 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  out);.    assert
2da80 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20  ( !memDb );.    
2da90 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
2daa0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2dab0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  DONLY);..    /* 
2dac0 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
2dad0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
2dae0 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
2daf0 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a  te access,.    *
2db00 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
2db10 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
2db20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
2db30 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a  create the.    *
2db40 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
2db50 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
2db60 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
2db70 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a  ximum of:.    **
2db80 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c  .    **    + SQL
2db90 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2dba0 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20  _SIZE,.    **   
2dbb0 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
2dbc0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2dbd0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
2dbe0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c     **    + The l
2dbf0 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65  argest page size
2dc00 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69   that can be wri
2dc10 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tten atomically.
2dc20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dc30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2dc40 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d  .      int iDc =
2dc50 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2dc60 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2dc70 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2dc80 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79     if( !readOnly
2dc90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53   ){.        setS
2dca0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2dcb0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2dcc0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2dcd0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2dce0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2dcf0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2dd00 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2dd10 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2dd20 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2dd30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2dd40 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2dd50 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2dd60 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2dd70 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2dd80 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
2dd90 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
2dda0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2ddc0 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70  ageDflt = (u32)p
2ddd0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2dde0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2ddf0 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
2de00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2de10 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2de20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
2de30 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
2de40 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2de50 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
2de60 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
2de70 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2de80 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2de90 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2dea0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2deb0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
2dec0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2ded0 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
2dee0 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
2def0 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
2df00 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2df10 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
2df20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2df30 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2df40 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2df50 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2df60 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2df70 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ii;.           
2df80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2df90 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2dfa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2dfb0 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73  ager->noLock = s
2dfc0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2dfd0 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e  an(zFilename, "n
2dfe0 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20  olock", 0);.    
2dff0 20 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c    if( (iDc & SQL
2e000 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41  ITE_IOCAP_IMMUTA
2e010 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  BLE)!=0.       |
2e020 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  | sqlite3_uri_bo
2e030 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2e040 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29   "immutable", 0)
2e050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66   ){.          vf
2e060 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2e070 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2e080 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
2e090 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c  ct_like_temp_fil
2e0a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2e0b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2e0c0 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
2e0d0 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
2e0e0 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
2e0f0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
2e100 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
2e110 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
2e120 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2e130 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
2e140 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
2e150 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
2e160 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
2e170 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
2e180 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2e190 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2e1a0 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
2e1b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2e1c0 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
2e1d0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2e1e0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2e1f0 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
2e200 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2e210 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
2e220 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
2e230 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
2e240 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
2e250 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2e260 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73  branch also runs
2e270 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65   for files marke
2e280 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a  d as immutable..
2e290 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65      */ .act_like
2e2a0 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20  _temp_file:.    
2e2b0 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2e2c0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2e2d0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2e2e0 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20       /* Pretend 
2e2f0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
2e300 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50  a lock */.    pP
2e310 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58  ager->eLock = EX
2e320 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20  CLUSIVE_LOCK;   
2e330 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2e340 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  re in EXCLUSIVE 
2e350 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a  locking mode */.
2e360 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2e370 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ck = 1;         
2e380 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20         /* Do no 
2e390 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72  locking */.    r
2e3a0 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2e3b0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2e3c0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2e3d0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2e3e0 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2e3f0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2e400 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2e410 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2e420 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2e430 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2e440 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2e450 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2e460 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e470 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2e480 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2e490 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2e4a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2e4b0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2e4c0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2e4d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2e4e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2e4f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
2e500 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
2e510 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
2e520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  {.    assert( nE
2e540 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20  xtra<1000 );.   
2e550 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2e560 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63  (nExtra);.    rc
2e570 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2e580 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2e590 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2e5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2e5c0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2e5d0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2e5e0 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2e5f0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
2e600 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2e610 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ed above, free t
2e620 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74  he  Pager struct
2e630 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2e640 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2e650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e660 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
2e670 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2e680 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  d);.    sqlite3P
2e690 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
2e6a0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
2e6b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2e6c0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
2e6d0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
2e6e0 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2e6f0 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2e700 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2e710 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e720 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2e730 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2e740 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2e750 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2e760 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2e770 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2e780 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2e790 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2e7a0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e7b0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2e7c0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e7d0 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2e7e0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2e7f0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2e800 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2e810 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e820 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2e830 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2e840 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2e850 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2e860 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2e870 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2e880 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e890 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
2e8a0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
2e8b0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
2e8c0 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
2e8d0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2e8e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2e8f0 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
2e900 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2e910 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2e920 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2e930 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2e940 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
2e950 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
2e960 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
2e970 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
2e980 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2e990 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
2e9a0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2e9b0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
2e9c0 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
2e9d0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
2e9e0 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73  8)readOnly;.  as
2e9f0 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
2ea00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
2ea10 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
2ea20 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
2ea30 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
2ea40 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2ea50 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
2ea60 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2ea70 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2ea80 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
2ea90 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2eaa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2eab0 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
2eac0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ead0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2eae0 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  lags==0 );.  }el
2eaf0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
2eb00 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20  fullSync = 1;.  
2eb10 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2eb20 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2eb30 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
2eb40 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2eb50 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2eb60 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59  _NORMAL | WAL_SY
2eb70 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
2eb80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
2eb90 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
2eba0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2ebb0 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2ebc0 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
2ebd0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2ebe0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
2ebf0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ec00 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
2ec10 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
2ec20 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
2ec30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2ec40 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
2ec50 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
2ec60 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
2ec70 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2ec80 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
2ec90 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
2eca0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2ecb0 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
2ecc0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
2ecd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2ece0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2ecf0 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
2ed00 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
2ed10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2ed20 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2ed30 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2ed40 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2ed50 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
2ed60 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ed70 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
2ed80 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
2ed90 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
2eda0 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
2edb0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
2edc0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
2edd0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
2ede0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2edf0 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54  ->szMmap = SQLIT
2ee00 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53  E_DEFAULT_MMAP_S
2ee10 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73  IZE // will be s
2ee20 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f  et by btree.c */
2ee30 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
2ee40 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
2ee50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2ee60 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
2ee70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ee80 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74  has not be delet
2ee90 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75  ed or renamed ou
2eea0 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20  t from.** under 
2eeb0 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75  the pager.  Retu
2eec0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2eed0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2eee0 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75  still were it ou
2eef0 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20  ght.** to be on 
2ef00 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f  disk.  Return no
2ef10 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52  n-zero (SQLITE_R
2ef20 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20  EADONLY_DBMOVED 
2ef30 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
2ef40 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d  ror.** code from
2ef50 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2ef60 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62  ()) if the datab
2ef70 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73  ase has gone mis
2ef80 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2ef90 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e  int databaseIsUn
2efa0 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61  moved(Pager *pPa
2efb0 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73  ger){.  int bHas
2efc0 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74  Moved = 0;.  int
2efd0 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
2efe0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72  er->tempFile ) r
2eff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f000 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2f010 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72  bSize==0 ) retur
2f020 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
2f030 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a  ssert( pPager->z
2f040 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67  Filename && pPag
2f050 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
2f060 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2f070 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
2f080 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
2f090 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56  TE_FCNTL_HAS_MOV
2f0a0 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b  ED, &bHasMoved);
2f0b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f0c0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
2f0d0 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f    /* If the HAS_
2f0e0 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  MOVED file-contr
2f0f0 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e  ol is unimplemen
2f100 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ted, assume that
2f110 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
2f120 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f   has not been mo
2f130 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68  ved.  That is th
2f140 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68  e historical beh
2f150 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a  avior of SQLite:
2f160 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a   prior to.    **
2f170 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20   version 3.8.3, 
2f180 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64  it never checked
2f190 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
2f1a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
2f1b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f1c0 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29  K && bHasMoved )
2f1d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2f1e0 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2f1f0 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ED;.  }.  return
2f200 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2f210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f220 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
2f230 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
2f240 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
2f250 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
2f260 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
2f270 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
2f280 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
2f290 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
2f2a0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2f2b0 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
2f2c0 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
2f2d0 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
2f2e0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2f2f0 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
2f300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2f310 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
2f320 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
2f330 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2f340 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
2f350 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
2f360 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f370 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
2f380 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
2f390 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
2f3a0 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
2f3b0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2f3c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f3d0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2f3e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f3f0 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
2f400 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
2f410 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
2f420 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
2f430 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2f440 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2f450 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
2f460 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
2f470 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
2f480 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2f490 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
2f4a0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
2f4b0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
2f4c0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
2f4d0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
2f4e0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
2f4f0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
2f500 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
2f510 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
2f520 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
2f530 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
2f540 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
2f550 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
2f560 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2f570 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2f580 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
2f590 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
2f5a0 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
2f5b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
2f5c0 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
2f5d0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
2f5e0 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
2f5f0 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
2f600 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
2f610 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
2f620 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f630 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2f640 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
2f650 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
2f660 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
2f670 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
2f680 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
2f690 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
2f6a0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
2f6b0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
2f6c0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2f6d0 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
2f6e0 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
2f6f0 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
2f700 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2f710 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
2f720 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
2f730 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
2f740 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f750 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
2f760 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2f770 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
2f780 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
2f790 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2f7a0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2f7b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2f7c0 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
2f7d0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
2f7e0 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
2f7f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2f800 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
2f810 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
2f820 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2f830 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
2f840 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
2f850 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
2f860 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
2f870 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
2f880 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
2f890 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2f8a0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2f8b0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
2f8c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2f8d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2f8e0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
2f8f0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
2f900 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f910 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
2f920 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
2f930 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
2f940 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f950 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
2f960 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2f970 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
2f980 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2f990 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
2f9a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2f9b0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
2f9c0 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
2f9d0 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
2f9e0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2f9f0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2fa00 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
2fa10 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
2fa20 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
2fa30 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
2fa40 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
2fa50 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
2fa60 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2fa70 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
2fa80 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
2fa90 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
2faa0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
2fab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fac0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
2fad0 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
2fae0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2faf0 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
2fb00 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2fb10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
2fb20 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
2fb30 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
2fb40 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
2fb50 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
2fb60 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
2fb70 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2fb80 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
2fb90 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
2fba0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
2fbb0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
2fbc0 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
2fbd0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2fbe0 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
2fbf0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
2fc00 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
2fc10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
2fc20 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2fc30 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
2fc40 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
2fc50 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
2fc60 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
2fc70 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
2fc80 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
2fc90 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
2fca0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
2fcb0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
2fcc0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2fcd0 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
2fce0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
2fcf0 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
2fd00 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
2fd10 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
2fd20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fd30 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2fd40 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
2fd50 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
2fd60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fd70 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
2fd80 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
2fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fda0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2fdb0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
2fdc0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63  ile */..      rc
2fdd0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
2fde0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2fdf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2fe00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2fe20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f  database is zero
2fe30 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20   pages in size, 
2fe40 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
2fe50 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20  either (1) the. 
2fe60 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
2fe70 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66  l is a remnant f
2fe80 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61  rom a prior data
2fe90 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2fea0 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20  me name where.  
2feb0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
2fec0 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e  abase file but n
2fed0 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  ot the journal w
2fee0 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28  as deleted, or (
2fef0 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20  2) the initial. 
2ff00 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
2ff10 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c  ction that popul
2ff20 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62  ates a new datab
2ff30 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ase is being rol
2ff40 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  led back..      
2ff50 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63    ** In either c
2ff60 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ase, the journal
2ff70 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c   file can be del
2ff80 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  eted.  However, 
2ff90 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20  take care.      
2ffa0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65    ** not to dele
2ffb0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2ffc0 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  ile if it is alr
2ffd0 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f  eady open due to
2ffe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
2fff0 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
30000 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30010 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
30020 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29  0 && !jrnlOpen )
30030 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
30040 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
30050 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
30060 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44    if( pagerLockD
30070 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
30080 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
30090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
300a0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
300b0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
300c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
300d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
300e0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
300f0 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c  eMode ) pagerUnl
30100 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
30110 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
30120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30130 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
30140 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
30150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30160 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
30170 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30180 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
30190 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
301a0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
301b0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
301c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
301d0 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
301e0 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
301f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
30200 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
30210 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
30220 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
30230 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
30240 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
30250 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
30260 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
30270 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
30280 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
30290 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
302a0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
302b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
302c0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
302d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
302e0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
302f0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
30300 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
30310 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
30320 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
30330 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
30340 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
30350 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
30360 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30370 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30390 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
303a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
303b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
303c0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
303d0 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
303e0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
303f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30400 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
30410 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
30420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30430 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
30440 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
30450 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
30460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
30470 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
30480 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
30490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
304a0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
304b0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
304c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
304d0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
304e0 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
304f0 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
30500 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
30510 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
30520 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
30530 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
30540 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72   ** it has a zer
30550 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
30560 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
30570 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
30580 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
30590 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
305a0 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
305b0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
305c0 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
305d0 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
305e0 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
305f0 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
30600 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
30610 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
30620 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
30630 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
30640 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
30650 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
30660 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
30670 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
30680 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
30690 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
306a0 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
306b0 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
306c0 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
306d0 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
306e0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
306f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
30700 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
30710 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
30720 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
30730 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
30740 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
30750 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30760 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30770 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30780 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
30790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
307a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
307b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
307c0 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
307d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
307e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  abase file..** I
307f0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
30800 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
30810 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c  rAcquire() until
30820 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
30830 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
30840 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
30850 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
30860 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
30870 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
30880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30890 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
308a0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
308b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
308c0 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
308d0 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
308e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
308f0 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
30900 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
30910 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
30920 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
30930 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
30940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
30950 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
30960 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
30970 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
30980 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
30990 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
309a0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
309b0 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
309c0 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
309d0 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
309e0 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
309f0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30a00 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
30a10 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
30a20 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
30a30 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
30a40 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
30a50 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
30a60 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
30a70 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
30a80 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
30a90 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
30aa0 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
30ab0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30ac0 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
30ad0 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
30ae0 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
30af0 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
30b00 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
30b10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
30b20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
30b30 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
30b40 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
30b50 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
30b60 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
30b70 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
30b80 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
30b90 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
30ba0 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
30bb0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
30bc0 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
30bd0 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
30be0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
30bf0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
30c00 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
30c10 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
30c20 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
30c30 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
30c40 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
30c50 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
30c60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
30c70 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
30c80 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
30c90 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
30ca0 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
30cb0 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
30cc0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
30cd0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
30ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
30cf0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
30d00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
30d10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
30d20 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
30d30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30d40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
30d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30d70 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
30d80 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
30d90 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
30da0 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
30db0 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
30dc0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
30dd0 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
30de0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
30df0 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
30e00 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
30e10 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
30e20 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
30e30 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
30e40 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
30e50 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
30e60 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ss mode..  */.  
30e70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30e80 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
30e90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
30ea0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
30eb0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
30ec0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
30ed0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30ee0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30ef0 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
30f00 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
30f10 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  R );.  if( NEVER
30f20 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
30f30 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
30f40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
30f50 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21  Code; }..  if( !
30f60 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30f70 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65  er) && pPager->e
30f80 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30f90 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f  N ){.    int bHo
30fa0 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20  tJournal = 1;   
30fb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30fc0 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
30fd0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   hot journal-fil
30fe0 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
30ff0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20  ( !MEMDB );..   
31000 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
31010 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
31020 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
31030 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
31050 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
31060 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
31070 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
31080 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
31090 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
310a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
310b0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
310c0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
310d0 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
310e0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
310f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
31100 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
31110 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
31120 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
31130 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
31140 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
31150 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
31160 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
31170 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
31180 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e  ager, &bHotJourn
31190 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
311a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
311b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
311c0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
311d0 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   if( bHotJournal
311e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
311f0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
31200 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
31210 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
31220 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
31230 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31240 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
31250 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
31260 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31270 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
31280 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
31290 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
312a0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
312b0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
312c0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
312d0 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
312e0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
312f0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
31300 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
31310 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
31320 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
31330 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
31340 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
31350 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
31360 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
31370 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
31380 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
31390 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
313a0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
313b0 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
313c0 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
313d0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
313e0 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
313f0 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
31400 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
31410 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
31420 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
31430 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
31440 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
31450 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
31460 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
31470 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
31480 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
31490 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
314a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
314b0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
314c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
314d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
314e0 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
314f0 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e  ger is in lockin
31500 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
31510 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
31520 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e  is.      ** down
31530 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44  graded to SHARED
31540 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69  _LOCK before thi
31550 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
31560 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ns..      */.   
31570 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
31580 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
31590 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
315a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
315b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
315c0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
315d0 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
315e0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
315f0 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68  eady open and th
31600 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e  e file exists on
31610 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20   disk, open the 
31620 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
31630 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
31640 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61   access. Write a
31650 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65  ccess is require
31660 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20  d because .     
31670 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65   ** in exclusive
31680 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
31690 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
316a0 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
316b0 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  en .      ** and
316c0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
316d0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
316e0 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c   later on. Also,
316f0 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20   write-access . 
31700 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c       ** is usual
31710 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  ly required to f
31720 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
31730 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  nal in journal_m
31740 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20  ode=persist .   
31750 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20     ** mode (and 
31760 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  also for journal
31770 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f  _mode=truncate o
31780 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e  n some systems).
31790 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
317a0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
317b0 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
317c0 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
317d0 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
317e0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
317f0 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
31800 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
31810 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
31820 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  e .      ** this
31830 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
31840 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
31850 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
31860 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  r, it .      ** 
31870 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  may mean that th
31880 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74  e pager was in t
31890 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
318a0 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a  hen this.      *
318b0 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
318c0 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
318d0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
318e0 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
318f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
31900 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
31910 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
31920 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
31930 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
31940 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69  >pVfs;.        i
31950 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20  nt bExists;     
31960 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31970 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
31980 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
31990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
319a0 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
319b0 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
319c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
319d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
319e0 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20  S, &bExists);.  
319f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31a00 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
31a10 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ts ){.          
31a20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
31a30 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
31a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
31a50 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
31a60 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
31a70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31a80 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
31a90 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
31aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
31ab0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
31ac0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31ad0 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
31ae0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
31af0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31b00 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
31b10 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
31b20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31b30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
31b40 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
31b50 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
31b60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31b70 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
31b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31b90 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31ba0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31bc0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
31bd0 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
31be0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
31bf0 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
31c00 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
31c10 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
31c20 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
31c30 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
31c40 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
31c50 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
31c60 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
31c70 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
31c80 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
31c90 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
31ca0 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
31cb0 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
31cc0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31cd0 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
31ce0 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
31cf0 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
31d00 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
31d10 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
31d20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
31d30 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
31d40 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
31d50 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
31d60 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
31d70 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
31d80 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
31d90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31da0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
31db0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31dc0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
31dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
31de0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
31df0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
31e00 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
31e10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31e20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31e30 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
31e40 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
31e50 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31e60 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
31e70 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
31e80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
31e90 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31ea0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
31eb0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
31ec0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31ed0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
31ee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31f00 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
31f10 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
31f20 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
31f30 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
31f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
31f50 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
31f60 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
31f70 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
31f80 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
31f90 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
31fa0 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
31fb0 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
31fc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
31fd0 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
31fe0 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
31ff0 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
32000 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
32010 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
32020 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
32030 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
32040 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
32050 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
32060 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
32070 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
32080 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
32090 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
320a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
320b0 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
320c0 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
320d0 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
320e0 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
320f0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
32100 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
32110 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
32120 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
32130 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
32140 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
32150 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
32160 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
32170 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
32180 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
32190 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
321a0 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
321b0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
321c0 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
321d0 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
321e0 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
321f0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
32200 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
32210 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
32220 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
32230 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
32240 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
32250 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
32260 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
32270 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
32280 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
32290 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
322a0 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
322b0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
322c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
322d0 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
322e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
322f0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32300 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32310 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32320 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32330 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
32340 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
32350 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
32360 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
32370 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32380 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
32390 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
323a0 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
323b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
323c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
323d0 20 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   (.        pPage
323e0 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20 20 20 20  r->pBackup .    
323f0 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
32400 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
32410 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20  r->pPCache)>0 . 
32420 20 20 20 20 7c 7c 20 55 53 45 46 45 54 43 48 28      || USEFETCH(
32430 70 50 61 67 65 72 29 0a 20 20 20 20 29 29 7b 0a  pPager).    )){.
32440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
32450 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
32460 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
32470 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
32480 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  file.      ** an
32490 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
324a0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
324b0 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
324c0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a  revious.      **
324d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
324e0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
324f0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
32500 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
32510 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
32520 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
32530 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
32540 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
32550 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
32560 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
32570 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
32580 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
32590 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
325a0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
325b0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
325c0 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
325d0 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
325e0 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
325f0 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
32600 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
32610 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
32620 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
32630 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
32640 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
32650 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
32660 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
32670 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
32680 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
32690 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
326a0 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
326b0 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
326c0 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
326d0 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
326e0 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
326f0 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
32700 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
32710 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
32720 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
32730 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
32740 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
32750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
32760 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20  gno nPage = 0;. 
32770 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
32780 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
32790 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
327a0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ;..      rc = pa
327b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
327c0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
327d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
327e0 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20  o failed;..     
327f0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
32800 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
32810 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
32820 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
32830 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
32840 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32850 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
32860 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
32870 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
32880 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
32890 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
328a0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
328b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
328c0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
328d0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
328e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
328f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32900 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
32910 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
32920 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
32930 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
32940 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
32950 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
32960 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
32970 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
32980 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
32990 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
329a0 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
329b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
329c0 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
329d0 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
329e0 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
329f0 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
32a00 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
32a10 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
32a20 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
32a30 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
32a40 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
32a50 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
32a60 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
32a70 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
32a80 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
32a90 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
32aa0 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
32ab0 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
32ac0 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
32ad0 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
32ae0 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
32af0 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
32b00 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
32b10 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
32b20 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
32b30 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
32b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
32b50 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
32b60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32b70 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
32b80 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
32b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32ba0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
32bb0 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
32bc0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
32bd0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
32be0 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
32bf0 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
32c00 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
32c10 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
32c20 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
32c30 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
32c40 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
32c50 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
32c60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
32c70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
32c80 65 72 2d 3e 6f 74 61 4d 6f 64 65 20 29 7b 0a 20  er->otaMode ){. 
32c90 20 20 20 20 20 69 6e 74 20 6e 57 61 6c 20 3d 20       int nWal = 
32ca0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
32cb0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 20  pPager->zWal);. 
32cc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61       pPager->zWa
32cd0 6c 5b 6e 57 61 6c 2d 33 5d 20 3d 20 27 6f 27 3b  l[nWal-3] = 'o';
32ce0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
32cf0 72 4f 70 65 6e 57 61 6c 49 6e 74 65 72 6e 61 6c  rOpenWalInternal
32d00 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
32d10 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
32d20 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
32d30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32d40 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
32d50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
32d60 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  if.  }..  if( pa
32d70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32d80 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
32d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32da0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
32db0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
32dc0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
32dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32de0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  _OK && pPager->o
32df0 74 61 4d 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20  taMode==1 ){.   
32e00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
32e10 61 6c 43 68 65 63 6b 53 61 6c 74 28 70 50 61 67  alCheckSalt(pPag
32e20 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
32e30 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  ->fd);.      if(
32e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32e50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32e60 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
32e70 2d 3e 70 57 61 6c 2c 20 30 2c 20 30 2c 20 30 29  ->pWal, 0, 0, 0)
32e80 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
32e90 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ->pWal = 0;.    
32ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32eb0 20 70 50 61 67 65 72 2d 3e 6f 74 61 4d 6f 64 65   pPager->otaMode
32ec0 20 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 2;.      }.  
32ed0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
32ee0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32ef0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
32f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32f10 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
32f20 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
32f30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
32f40 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
32f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32f60 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
32f70 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
32f80 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
32f90 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
32fa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32fb0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
32fd0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
32fe0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20  ER_READER;.  }. 
32ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33000 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
33010 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
33020 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
33030 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
33040 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
33050 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
33060 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
33070 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
33080 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
33090 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
330a0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
330b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
330c0 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
330d0 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
330e0 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
330f0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
33100 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
33110 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
33120 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
33130 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
33140 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
33150 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
33160 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26  r->nMmapOut==0 &
33170 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  & (sqlite3Pcache
33180 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
33190 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
331a0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
331b0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
331c0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
331d0 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
331e0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
331f0 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
33200 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
33210 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
33220 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
33230 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
33240 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
33250 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
33260 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
33270 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
33280 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
33290 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
332a0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
332b0 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
332c0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
332d0 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
332e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
332f0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
33300 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
33310 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
33320 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
33330 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
33340 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
33350 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
33360 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
33370 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
33380 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
33390 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
333a0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
333b0 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
333c0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
333d0 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
333e0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
333f0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
33400 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
33410 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
33420 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
33430 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
33440 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
33450 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
33460 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
33470 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
33480 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
33490 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
334a0 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
334b0 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
334c0 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
334d0 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
334e0 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
334f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
33500 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
33510 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
33520 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
33530 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
33540 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
33550 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
33560 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
33570 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
33580 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
33590 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
335a0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
335b0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
335c0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
335d0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
335e0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
335f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
33600 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
33610 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
33620 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
33630 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
33640 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
33650 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
33660 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
33670 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
33680 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63  occurs in two sc
33690 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
336a0 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
336b0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
336c0 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
336d0 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
336e0 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
336f0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
33700 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
33710 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
33720 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
33730 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
33740 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
33750 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
33760 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
33770 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
33780 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
33790 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
337a0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
337b0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
337c0 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
337d0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
337e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
337f0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
33800 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
33810 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
33820 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
33830 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
33840 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
33850 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
33860 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
33870 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
33880 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
33890 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
338a0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
338b0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
338c0 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
338d0 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
338e0 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
338f0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
33900 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
33910 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
33920 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
33930 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
33940 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
33950 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
33960 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
33970 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
33980 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
33990 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
339a0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
339b0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
339c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
339d0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
339e0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
339f0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
33a00 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
33a10 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
33a20 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
33a30 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
33a40 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
33a50 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
33a60 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
33a70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
33a80 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
33a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
33aa0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
33ab0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
33ac0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
33ad0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
33ae0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
33af0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
33b00 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
33b10 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
33b20 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
33b30 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
33b40 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
33b50 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
33b60 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
33b70 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
33b80 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
33b90 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
33ba0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
33bb0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
33bc0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
33bd0 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
33be0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
33bf0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
33c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33c10 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
33c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
33c30 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
33c40 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
33c50 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
33c60 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
33c70 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
33c80 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
33c90 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
33ca0 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
33cb0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
33cc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
33cd0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
33ce0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
33cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d00 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
33d10 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
33d20 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43  .  const int noC
33d30 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20  ontent = (flags 
33d40 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  & PAGER_GET_NOCO
33d50 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74  NTENT);..  /* It
33d60 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
33d70 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
33d80 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
33d90 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
33da0 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
33db0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
33dc0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
33dd0 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
33de0 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
33df0 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
33e00 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
33e10 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
33e20 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
33e30 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
33e40 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
33e50 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
33e60 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
33e70 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26 26 20 55   = (pgno!=1 && U
33e80 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 0a  SEFETCH(pPager).
33e90 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
33ea0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
33eb0 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DER || (flags & 
33ec0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
33ed0 4c 59 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  LY)).#ifdef SQLI
33ee0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
33ef0 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
33f00 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b  c==0.#endif.  );
33f10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
33f20 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
33f30 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
33f40 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
33f50 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
33f60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f   );.  assert( no
33f70 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d  Content==0 || bM
33f80 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69  mapOk==0 );..  i
33f90 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
33fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33fb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
33fc0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
33fd0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
33fe0 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
33ff0 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
34000 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
34010 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
34020 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
34030 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
34040 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
34050 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
34060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
34070 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
34080 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
34090 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70  if( bMmapOk && p
340a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
340b0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
340c0 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
340d0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
340e0 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
340f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
34100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
34110 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34120 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34130 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69  if( bMmapOk && i
34140 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
34150 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
34160 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0;..      rc = s
34170 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50  qlite3OsFetch(pP
34180 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20  ager->fd, .     
34190 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d       (i64)(pgno-
341a0 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
341b0 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70  eSize, pPager->p
341c0 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a  ageSize, &pData.
341d0 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
341e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
341f0 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20  K && pData ){.  
34200 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
34210 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52  ->eState>PAGER_R
34220 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20  EADER ){.       
34230 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
34240 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
34250 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
34260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
34270 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
34280 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41       rc = pagerA
34290 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50  cquireMapPage(pP
342a0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74  ager, pgno, pDat
342b0 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  a, &pPg);.      
342c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
342d0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
342e0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
342f0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50  (i64)(pgno-1)*pP
34300 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
34310 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
34320 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
34330 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  g ){.          a
34340 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
34350 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
34360 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
34370 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
34380 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
34390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
343a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
343b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
343c0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
343d0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
343e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20  }.    }..    {. 
343f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61       sqlite3_pca
34400 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b  che_page *pBase;
34410 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20 73  .      pBase = s
34420 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34430 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
34440 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  e, pgno, 3);.   
34450 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
34460 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34470 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34480 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72 2d  chStress(pPager-
34490 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
344a0 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  &pBase);.       
344b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
344c0 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
344d0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
344e0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d     }.      pPg =
344f0 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74   *ppPage = sqlit
34500 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
34510 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
34520 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65  che, pgno, pBase
34530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
34540 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
34550 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
34560 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
34570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
34580 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
34590 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
345a0 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
345b0 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
345c0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
345d0 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
345e0 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
345f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
34600 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
34610 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
34620 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
34630 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
34640 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
34650 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
34660 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34670 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
34680 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
34690 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
346a0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
346b0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
346c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
346d0 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
346e0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
346f0 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
34700 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
34710 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
34720 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
34730 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
34740 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
34750 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
34760 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
34770 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
34780 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
34790 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
347a0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
347b0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
347c0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
347d0 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b  AGER_STAT_HIT]++
347e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
347f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
34800 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
34810 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
34820 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
34830 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
34840 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
34850 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
34860 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  /..    pPg = *pp
34870 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
34880 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
34890 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
348a0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
348b0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
348c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
348d0 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
348e0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
348f0 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
34900 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
34910 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
34920 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
34930 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
34940 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
34950 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
34960 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
34970 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34980 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
34990 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
349a0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
349b0 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
349c0 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
349d0 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21  | noContent || !
349e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
349f0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
34a00 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
34a10 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
34a20 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
34a30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34a40 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34a60 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
34a70 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
34a80 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
34a90 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
34aa0 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
34ab0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
34ac0 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
34ad0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
34ae0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
34af0 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
34b00 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
34b10 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
34b20 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
34b30 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
34b40 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
34b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
34b60 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
34b70 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
34b80 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
34b90 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
34ba0 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
34bb0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
34bc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34bd0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
34be0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
34bf0 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
34c00 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
34c10 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
34c20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
34c30 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
34c40 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
34c50 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
34c60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34c80 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
34c90 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
34ca0 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
34cb0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
34cc0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
34cd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
34d00 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
34d10 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
34d20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
34d30 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
34d40 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
34d50 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
34d60 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
34d70 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
34d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
34d90 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
34da0 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d  ger) && bMmapOk=
34db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
34dc0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
34dd0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
34de0 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
34df0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
34e00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34e10 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34e20 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
34e40 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
34e50 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
34e60 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
34e70 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
34e80 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
34e90 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
34ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
34eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34ec0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34ed0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
34ef0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
34f00 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
34f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34f20 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
34f30 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
34f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
34f50 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
34f60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
34f70 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
34f80 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
34f90 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
34fa0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
34fb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34fc0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
34fd0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
34fe0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
34ff0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
35000 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
35010 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
35020 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
35030 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
35040 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
35050 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
35060 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
35070 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
35080 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
35090 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
350a0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
350b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
350c0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
350d0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
350e0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
350f0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
35100 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
35110 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
35120 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
35130 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
35140 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
35150 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
35160 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
35170 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
35180 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
35190 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
351a0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
351b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
351c0 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63  o){.  sqlite3_pc
351d0 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65  ache_page *pPage
351e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
351f0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
35200 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
35210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35220 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
35230 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
35240 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
35250 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
35260 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 0);.  return s
35270 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
35280 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
35290 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
352a0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
352b0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
352c0 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
352d0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
352e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
352f0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
35300 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
35310 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
35320 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
35330 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
35340 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
35350 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
35360 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
35370 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
35380 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35390 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
353a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
353b0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
353c0 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ll(DbPage *pPg){
353d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
353e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
353f0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  =0 );.  pPager =
35400 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
35410 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  if( pPg->flags &
35420 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20   PGHDR_MMAP ){. 
35430 20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d     pagerReleaseM
35440 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  apPage(pPg);.  }
35450 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
35460 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
35470 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
35480 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
35490 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73  Pager);.}.void s
354a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
354b0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
354c0 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74   if( pPg ) sqlit
354d0 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
354e0 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ull(pPg);.}../*.
354f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35500 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
35510 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
35520 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
35530 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
35540 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
35550 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
35560 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
35570 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
35580 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
35590 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
355a0 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
355b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
355c0 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
355d0 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
355e0 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
355f0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
35600 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
35610 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
35620 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
35630 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
35640 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
35650 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
35660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35670 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
35680 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
35690 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
356a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
356b0 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
356c0 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
356d0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
356e0 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
356f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
35700 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
35710 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
35720 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
35730 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
35740 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
35750 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
35760 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
35770 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
35780 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
35790 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
357a0 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
357b0 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
357c0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
357d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
357e0 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
357f0 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
35800 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
35810 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
35820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
35830 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
35840 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
35850 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
35860 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
35870 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
35880 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
35890 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
358a0 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
358b0 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
358c0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
358d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
358e0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
358f0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
35900 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
35910 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
35920 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
35930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35940 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
35950 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
35960 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
35970 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
35980 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
35990 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
359a0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
359b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
359c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
359d0 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
359e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
359f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35a00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35a10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
35a20 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
35a30 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
35a40 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
35a50 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35a60 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
35a70 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
35a80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35a90 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
35aa0 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
35ab0 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
35ac0 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
35ad0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
35ae0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
35af0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
35b00 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
35b10 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
35b20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
35b30 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
35b40 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
35b50 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
35b60 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
35b70 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
35b80 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
35b90 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
35ba0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
35bb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35bc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
35bd0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
35be0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
35bf0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
35c00 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
35c10 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
35c20 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
35c30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
35c40 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
35c50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
35c60 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
35c70 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
35c80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
35c90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35ca0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
35cb0 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
35cd0 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
35ce0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
35cf0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
35d00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
35d10 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
35d20 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ATE|.          (
35d30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
35d40 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
35d50 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
35d60 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
35d70 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
35d80 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
35d90 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
35da0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
35db0 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
35dc0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
35dd0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
35de0 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d  till has the sam
35df0 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64  e name as it did
35e00 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
35e10 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c   it was original
35e20 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  ly opened. */.  
35e30 20 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62        rc = datab
35e40 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61  aseIsUnmoved(pPa
35e50 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
35e60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35e70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
35e80 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
35e90 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 72  RITE.          r
35ea0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
35eb0 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
35ec0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
35ed0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
35ee0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
35ef0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
35f00 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20  (pPager).       
35f10 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
35f20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35f30 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
35f40 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
35f50 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
35f60 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
35f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35f80 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
35f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
35fa0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
35fb0 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
35fc0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
35fd0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
35fe0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
35ff0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
36000 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
36010 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36020 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
36030 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
36040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36050 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
36060 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
36070 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
36080 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
36090 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
360a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
360b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
360c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
360d0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
360e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
360f0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
36100 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
36110 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
36120 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
36130 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36140 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
36150 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
36160 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
36170 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
36180 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
36190 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
361a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
361b0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
361c0 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
361d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
361e0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
361f0 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
36200 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
36210 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
36220 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
36230 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
36240 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
36250 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36260 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
36270 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
36280 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
36290 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
362a0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
362b0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
362c0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
362d0 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
362e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
362f0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
36300 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
36310 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
36320 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
36330 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
36340 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
36350 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
36360 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
36370 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
36380 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
36390 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
363a0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
363b0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
363c0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
363d0 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
363e0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
363f0 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
36400 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
36410 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
36420 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
36430 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
36440 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
36450 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
36460 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
36470 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
36480 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
36490 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
364a0 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
364b0 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
364c0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
364d0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
364e0 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
364f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
36500 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
36510 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
36520 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
36530 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
36540 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
36550 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
36560 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
36570 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
36580 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
36590 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
365a0 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
365b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
365c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
365d0 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
365e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
365f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36600 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
36610 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
36620 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52  >eState<PAGER_ER
36630 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ROR );.  pPager-
36640 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
36650 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
36660 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
36670 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36680 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b  PAGER_READER) ){
36690 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
366a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
366b0 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
366c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
366d0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
366e0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
366f0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
36700 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
36710 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
36720 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
36730 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
36740 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
36750 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
36760 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
36770 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
36780 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
36790 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
367a0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
367b0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
367c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
367d0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
367e0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
367f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
36800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
36820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
36830 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
36840 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
36850 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
36860 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
36870 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
36880 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
36890 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
368a0 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
368b0 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
368c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
368d0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
368e0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
368f0 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
36900 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
36910 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
36920 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
36930 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
36940 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
36950 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
36960 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
36970 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
36980 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
36990 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
369a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
369b0 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
369c0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
369d0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
369e0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
369f0 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
36a00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36a10 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
36a20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
36a30 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
36a40 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
36a50 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
36a60 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
36a70 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
36a80 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
36a90 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
36aa0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
36ab0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
36ac0 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
36ad0 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
36ae0 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
36af0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
36b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
36b10 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
36b20 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
36b30 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
36b40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36b50 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
36b60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
36b70 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
36b80 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36b90 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
36ba0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
36bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36bc0 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
36bd0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
36be0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
36bf0 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
36c00 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
36c10 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
36c20 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
36c30 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
36c40 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
36c50 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
36c60 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
36c70 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
36c80 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
36c90 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
36ca0 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
36cb0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
36cc0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
36cd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
36ce0 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
36cf0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
36d00 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
36d10 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
36d20 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
36d30 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
36d40 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
36d50 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
36d60 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
36d70 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
36d80 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
36d90 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
36da0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
36db0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
36dc0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
36dd0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
36de0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
36df0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36e00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
36e10 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
36e20 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36e30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
36e40 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
36e50 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36e60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
36e70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36e80 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
36e90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
36ea0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
36eb0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36ec0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
36ed0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
36ee0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
36ef0 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
36f00 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
36f10 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
36f20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
36f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
36f40 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
36f50 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
36f60 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
36f70 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
36f80 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
36f90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
36fa0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
36fb0 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
36fc0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
36fd0 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
36fe0 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
36ff0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
37000 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
37010 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
37020 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
37030 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
37040 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
37050 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
37060 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
37070 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
37080 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
37090 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
370a0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
370b0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
370c0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
370d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
370e0 20 69 6e 74 20 69 6e 4a 6f 75 72 6e 61 6c 3b 0a   int inJournal;.
370f0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
37100 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
37110 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d   unless a write-
37120 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
37130 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65  already .  ** be
37140 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20  en started. The 
37150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
37160 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
37170 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
37180 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  t..  ** It is ne
37190 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68  ver called in th
371a0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20  e ERROR state.. 
371b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
371c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
371d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
371e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
371f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37200 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37210 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
37220 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37230 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
37240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37250 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37260 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
37270 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
37280 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73  rCode==0 );.  as
37290 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65  sert( pPager->re
372a0 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20  adOnly==0 );..  
372b0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
372c0 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e  ..  /* The journ
372d0 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
372e0 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68   be opened. High
372f0 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
37300 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  s have already. 
37310 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65   ** obtained the
37320 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73   necessary locks
37330 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72   to begin the wr
37340 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
37350 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f   but the.  ** ro
37360 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
37370 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20  ight not yet be 
37380 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f  open. Open it no
37390 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  w if this is the
373a0 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
373b0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
373c0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fore calling sql
373d0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
373e0 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67  rty() on the pag
373f0 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
37400 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64  se, if it were d
37410 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e  one after callin
37420 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
37430 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e  akeDirty(), then
37440 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d  .  ** an error m
37450 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74  ight occur and t
37460 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65  he pager would e
37470 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f  nd up in WRITER_
37480 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a  LOCKED state.  *
37490 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72  * with pages mar
374a0 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20  ked as dirty in 
374b0 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  the cache..  */.
374c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
374d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
374e0 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
374f0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
37500 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
37510 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
37520 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37530 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
37540 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37550 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
37560 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73  CACHEMOD );.  as
37570 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
37580 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
37590 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74   );..  /* Mark t
375a0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
375b0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
375c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
375d0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
375e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
375f0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
37600 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
37610 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
37620 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
37630 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 70 61 67   inJournal = pag
37640 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
37650 72 2c 20 70 50 67 29 3b 0a 20 20 69 66 28 20 69  r, pPg);.  if( i
37660 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
37670 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
37680 3d 30 20 7c 7c 20 21 73 75 62 6a 52 65 71 75 69  =0 || !subjRequi
37690 72 65 73 50 61 67 65 28 70 50 67 29 29 20 29 7b  resPage(pPg)) ){
376a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
376b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
376c0 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) );.  }else{.  
376d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
376e0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
376f0 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
37700 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
37710 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
37720 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
37730 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
37740 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
37750 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
37760 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
37770 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
37780 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
37790 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
377a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
377b0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 61 67  nJournal && !pag
377c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
377d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
377e0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
377f0 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
37800 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
37810 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
37820 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ize && isOpen(pP
37830 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
37840 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
37850 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
37860 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69  Data2;.        i
37870 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
37880 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
37890 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
378a0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
378b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
378c0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
378d0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
378e0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
378f0 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
37900 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
37910 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
37920 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
37930 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
37940 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
37950 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
37960 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
37970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
37980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
37990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
379a0 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  ff );.        CO
379b0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
379c0 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
379d0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
379e0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
379f0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  a2);.        cks
37a00 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
37a10 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
37a20 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  ata2);..        
37a30 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f  /* Even if an IO
37a40 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72   or diskfull err
37a50 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37a60 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
37a70 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
37a80 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
37a90 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
37aa0 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
37ab0 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
37ac0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
37ad0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
37ae0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
37af0 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
37b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
37b10 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
37b20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
37b30 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
37b40 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
37b50 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
37b60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
37b70 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
37b80 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
37b90 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
37ba0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
37bb0 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
37bc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37bd0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
37be0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
37bf0 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
37c00 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
37c10 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70  er->jfd, iOff, p
37c20 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
37c30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37c40 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37c50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
37c60 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
37c70 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
37c80 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
37c90 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20  ize, iOff+4);.  
37ca0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37cb0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37cc0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
37cd0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37ce0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b  ager->jfd, iOff+
37cf0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37d00 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  +4, cksum);.    
37d10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37d20 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
37d30 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52  c;..        IOTR
37d40 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
37d50 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
37d60 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
37d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37d80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
37d90 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
37da0 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
37db0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
37dc0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
37dd0 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
37de0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
37df0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
37e00 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
37e10 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
37e20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
37e30 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
37e40 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
37e50 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
37e60 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
37e70 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
37e80 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
37e90 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
37ea0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20  journalOff += 8 
37eb0 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
37ec0 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ze;.        pPag
37ed0 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
37ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
37ef0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
37f00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
37f10 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
37f20 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
37f30 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
37f40 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
37f50 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
37f60 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
37f70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
37f80 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
37f90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37fa0 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
37fb0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
37fc0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
37fd0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
37fe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
38000 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
38010 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
38020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
38030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
38040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
38050 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
38060 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
38070 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MOD ){.         
38080 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
38090 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
380a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
380b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41    PAGERTRACE(("A
380c0 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
380d0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
380e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
380f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
38100 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
38110 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
38120 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
38130 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
38140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
38150 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
38160 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
38170 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
38180 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
38190 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
381a0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
381b0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
381c0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
381d0 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
381e0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
381f0 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
38200 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
38210 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
38220 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
38230 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
38240 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
38250 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
38260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
38270 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
38280 6e 74 3e 30 20 26 26 20 73 75 62 6a 52 65 71 75  nt>0 && subjRequ
38290 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
382a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
382b0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
382c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
382d0 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
382e0 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
382f0 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
38300 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
38310 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
38320 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
38330 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
38340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38350 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
38360 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
38370 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
38380 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20 74  that runs when t
38390 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 2a  he sector size.*
383a0 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
383b0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20   the page size. 
383c0 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 74 68   SQLite makes th
383d0 65 20 28 72 65 61 73 6f 6e 61 62 6c 65 29 20 61  e (reasonable) a
383e0 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 0a 2a  ssumption that.*
383f0 2a 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 20 61  * all bytes of a
38400 20 73 65 63 74 6f 72 20 61 72 65 20 77 72 69 74   sector are writ
38410 74 65 6e 20 74 6f 67 65 74 68 65 72 20 62 79 20  ten together by 
38420 68 61 72 64 77 61 72 65 2e 20 20 48 65 6e 63 65  hardware.  Hence
38430 2c 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 0a 2a  , all bytes of.*
38440 2a 20 61 20 73 65 63 74 6f 72 20 6e 65 65 64 20  * a sector need 
38450 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64  to be journalled
38460 20 69 6e 20 63 61 73 65 20 6f 66 20 61 20 70 6f   in case of a po
38470 77 65 72 20 6c 6f 73 73 20 69 6e 20 74 68 65 20  wer loss in the 
38480 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 20 77  middle of.** a w
38490 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61  rite..**.** Usua
384a0 6c 6c 79 2c 20 74 68 65 20 73 65 63 74 6f 72 20  lly, the sector 
384b0 73 69 7a 65 20 69 73 20 6c 65 73 73 20 74 68 61  size is less tha
384c0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
384d0 65 20 70 61 67 65 20 73 69 7a 65 2c 20 69 6e 20  e page size, in 
384e0 77 68 69 63 68 0a 2a 2a 20 63 61 73 65 20 70 61  which.** case pa
384f0 67 65 73 20 63 61 6e 20 62 65 20 69 6e 64 69 76  ges can be indiv
38500 69 64 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e  idually written.
38510 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
38520 6e 6c 79 20 72 75 6e 73 20 69 6e 20 74 68 65 20  nly runs in the 
38530 65 78 63 65 70 74 69 6f 6e 61 6c 0a 2a 2a 20 63  exceptional.** c
38540 61 73 65 20 77 68 65 72 65 20 74 68 65 20 70 61  ase where the pa
38550 67 65 20 73 69 7a 65 20 69 73 20 73 6d 61 6c 6c  ge size is small
38560 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 74  er than the sect
38570 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  or size..*/.stat
38580 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
38590 4e 45 20 69 6e 74 20 70 61 67 65 72 57 72 69 74  NE int pagerWrit
385a0 65 4c 61 72 67 65 53 65 63 74 6f 72 28 50 67 48  eLargeSector(PgH
385b0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
385c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
385d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
385e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
385f0 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
38600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38610 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
38620 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
38630 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
38640 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
38650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
38660 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
38670 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
38680 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
38690 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
386a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
386b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
386c0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
386d0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
386e0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
386f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38700 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
38710 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53 79   */.  int n