/ Hex Artifact Content
Login

Artifact 6277bebe07ac45bc99fb912ec105f913be804a83:


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 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e 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 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 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: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 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 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 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 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, 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 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  /.  int nHit, nM
7ff0: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
8000: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8010: 69 74 73 20 61 6e 64 20 6d 69 73 73 65 73 20 2a  its and misses *
8020: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8030: 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64  TEST.  int nRead
8040: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
8050: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
8060: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
8070: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
8080: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8090: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
80a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
80b0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
80c0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
80d0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
80e0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
80f0: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8100: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
8110: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
8120: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8130: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8140: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8150: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8160: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8170: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8180: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8190: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
81a0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
81b0: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
81c0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
81e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
81f0: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8200: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
8210: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
8220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8230: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8240: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8250: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8260: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8280: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8290: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
82a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
82b0: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
82e0: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
82f0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8300: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8330: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8340: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8350: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8360: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
8370: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
8380: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
8390: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
83a0: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
83b0: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
83c0: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
83d0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
83e0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
83f0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
8400: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
8410: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
8420: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
8430: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
8440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8450: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
8460: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
8470: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
8480: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
8490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
84a0: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
84b0: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
84c0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
84d0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
84e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
84f0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
8500: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
8510: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
8520: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
8530: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8540: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
8550: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
8560: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
8570: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
8580: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
8590: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
85a0: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
85b0: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
85c0: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
85d0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
85e0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
85f0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
8600: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
8610: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
8620: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
8630: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
8640: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
8650: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8660: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
8670: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
8680: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
8690: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
86a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
86b0: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
86c0: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
86d0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
86e0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
86f0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
8700: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
8710: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
8720: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
8730: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
8740: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
8750: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
8760: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
8770: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
8780: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
8790: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
87a0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
87b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
87c0: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
87d0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
87e0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
87f0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
8800: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
8810: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
8820: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
8830: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
8840: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8850: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
8860: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
8870: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
8880: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
8890: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
88a0: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
88b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
88c0: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
88d0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
88e0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
88f0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
8900: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
8910: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
8920: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
8930: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
8940: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
8950: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
8960: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
8970: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
8980: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
8990: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
89a0: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
89b0: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
89c0: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
89d0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
89e0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
89f0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
8a00: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
8a10: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
8a20: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
8a30: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
8a40: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
8a50: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
8a60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
8a70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
8a80: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
8a90: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
8aa0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
8ab0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
8ac0: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
8ad0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20   size of the of 
8ae0: 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64  each page record
8af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8b00: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74  is given by.** t
8b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
8b20: 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ro..*/.#define J
8b30: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
8b40: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
8b50: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
8b60: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
8b70: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
8b80: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  r this pager. Th
8b90: 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68  is is usually th
8ba0: 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20  e same .** size 
8bb0: 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  as a single disk
8bc0: 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73   sector. See als
8bd0: 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  o setSectorSize(
8be0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  )..*/.#define JO
8bf0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8c00: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
8c10: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
8c20: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
8c30: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
8c40: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
8c50: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
8c60: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
8c70: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
8c80: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
8c90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8ca0: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
8cb0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
8cc0: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
8cd0: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
8ce0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
8cf0: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
8d00: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
8d10: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
8d20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8d30: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
8d40: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
8d50: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
8d60: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
8d70: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
8d80: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
8d90: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
8da0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
8db0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
8dc0: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
8dd0: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
8de0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
8df0: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
8e00: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
8e10: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
8e20: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
8e30: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
8e40: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
8e50: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
8e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
8e70: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
8e80: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
8e90: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
8ea0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
8eb0: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
8ec0: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
8ed0: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
8ee0: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
8ef0: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
8f00: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
8f10: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
8f20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
8f30: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
8f40: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
8f50: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
8f60: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
8f70: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
8f80: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
8f90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
8fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
8fb0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
8fc0: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
8fd0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
8fe0: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
8ff0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9000: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9010: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9020: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
9030: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9040: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
9050: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
9060: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9070: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9080: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9090: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
90a0: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
90b0: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
90c0: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
90d0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
90e0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
90f0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
9100: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
9110: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
9120: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
9130: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9140: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9150: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9160: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9170: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9180: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9190: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
91a0: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
91b0: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
91c0: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
91d0: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
91e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
91f0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
9200: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9210: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9240: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9250: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9260: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9270: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9280: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9290: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
92a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
92b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
92c0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
92e0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
92f0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
9300: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
9310: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
9320: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
9330: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9340: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9350: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9360: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9370: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9380: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9390: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
93a0: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
93b0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
93c0: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
93d0: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
93e0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
93f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9400: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9410: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
9420: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
9430: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9440: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9450: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9460: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9470: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9480: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9490: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
94a0: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
94b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
94c0: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
94d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
94e0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
94f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9500: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
9510: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
9520: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9530: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9540: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9550: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9560: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9570: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9580: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9590: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
95a0: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
95b0: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
95c0: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
95d0: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
95e0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
95f0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9610: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9620: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9630: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9640: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9650: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9660: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9670: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9680: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
96a0: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
96b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
96c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
96d0: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
96e0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
96f0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9700: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9710: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9720: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9730: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9740: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9750: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9760: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9770: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9780: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9790: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
97a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
97b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
97c0: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
97d0: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
97e0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
97f0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9800: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9810: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9820: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9830: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9840: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9850: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9860: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9870: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9880: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9890: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
98a0: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
98b0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
98c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
98d0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
98e0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
98f0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9900: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9910: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9920: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9930: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9950: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9960: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9970: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9980: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9990: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
99a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
99b0: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
99c0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
99d0: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
99f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9a00: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9a10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9a20: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9a30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9a40: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9a50: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f  ED_LOCK || p->no
9a60: 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  Readlock );.    
9a70: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9a80: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9a90: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
9aa0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
9ab0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
9ac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9ad0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ae0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9af0: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
9b00: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
9b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9b20: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9b30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
9b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b50: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70  Pager->dbSize==p
9b60: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b70: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9b80: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
9b90: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
9ba0: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
9bb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9bc0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
9bd0: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
9be0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9bf0: 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
9c00: 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ster==0 );.     
9c10: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9c20: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e PAGER_WRITER_C
9c30: 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61  ACHEMOD:.      a
9c40: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9c50: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9c60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c70: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9c90: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
9ca0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
9cb0: 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20         /* It is 
9cc0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66  possible that if
9cd0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
9ce0: 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74  l here that neit
9cf0: 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20  her the.        
9d00: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
9d10: 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nor the WAL file
9d20: 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20   are open. This 
9d30: 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20  happens during. 
9d40: 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c         ** a roll
9d50: 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
9d60: 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66   that switches f
9d70: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  rom journal_mode
9d80: 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  =off.        ** 
9d90: 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  to journal_mode=
9da0: 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  wal..        */.
9db0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9dc0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9dd0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9de0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9df0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9e00: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9e10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9e20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9e30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
9e40: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
9e50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9e60: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
9e70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9e80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e90: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
9ea0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
9eb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ec0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
9ed0: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
9ee0: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
9ef0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9f00: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9f10: 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  DBMOD:.      ass
9f20: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
9f30: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9f40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f50: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9f60: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9f70: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
9f80: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9f90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9fa0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55   p->eLock>=EXCLU
9fb0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9fc0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9fd0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9fe0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ff0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a000: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a020: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a030: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a040: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a050: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a060: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d  er->dbOrigSize<=
a070: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a080: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a090: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a0a0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
a0b0: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a0c0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a0d0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a100: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a110: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a120: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a140: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a150: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a160: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a170: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a180: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a190: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a1a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a1b0: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a1c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1d0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52     case PAGER_ER
a1e0: 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68  ROR:.      /* Th
a1f0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
a200: 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
a210: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74  ding reference t
a220: 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20  o the pager if. 
a230: 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52       ** in ERROR
a240: 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
a250: 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75  e the pager shou
a260: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
a270: 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a  dropped.      **
a280: 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
a290: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2b0: 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
a2c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a2d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a2e0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a2f0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
a300: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a310: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
a320: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
a330: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
a340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a350: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
a360: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
a370: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
a380: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
a390: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
a3a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
a3b0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
a3c0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a3d0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
a3e0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
a3f0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
a400: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
a410: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
a420: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
a430: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
a440: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
a450: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
a460: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
a470: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
a480: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
a490: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4a0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
a4b0: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
a4c0: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
a4d0: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
a4e0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
a4f0: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
a500: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
a510: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
a520: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
a530: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
a540: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
a550: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
a560: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
a570: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
a580: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
a590: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
a5a0: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
a5b0: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
a5c0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
a5d0: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
a5e0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
a5f0: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
a600: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
a610: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
a620: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
a630: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
a640: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
a650: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
a660: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
a670: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
a680: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
a690: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a6a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
a6b0: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
a6c0: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
a6d0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6e0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
a6f0: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
a700: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a720: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
a730: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
a740: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a750: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a760: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
a770: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
a780: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a790: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a7a0: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
a7b0: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
a7c0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a7d0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
a7e0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
a7f0: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
a800: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
a810: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
a820: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
a830: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
a840: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
a850: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
a860: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
a870: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
a880: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a890: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
a8a0: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
a8b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
a8c0: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
a8d0: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
a8e0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
a8f0: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
a900: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
a910: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
a920: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
a930: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
a940: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
a950: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a960: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
a970: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
a980: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
a990: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a9a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a9b0: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
a9c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
a9d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a9e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
a9f0: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
aa00: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aa10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
aa20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
aa30: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
aa40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aa50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aa60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
aa70: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
aa80: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
aa90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aaa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
aab0: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
aac0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
aad0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
aae0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
aaf0: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
ab00: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
ab10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
ab20: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
ab30: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
ab40: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
ab50: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
ab60: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
ab70: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
ab80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ab90: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
aba0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
abb0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
abc0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
abd0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
abe0: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
abf0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
ac00: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
ac10: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
ac20: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
ac30: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
ac40: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
ac50: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
ac60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
ac70: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
ac80: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
ac90: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
aca0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
acb0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
acc0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
acd0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
ace0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
acf0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
ad00: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
ad10: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
ad20: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
ad30: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
ad40: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ad50: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
ad60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ad70: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ad80: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
ad90: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
ada0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
adb0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
adc0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
add0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
ade0: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
adf0: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
ae00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
ae10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ae20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ae30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
ae40: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
ae50: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
ae60: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
ae70: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
ae80: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
ae90: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
aea0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
aeb0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
aec0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
aee0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
aef0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
af00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
af10: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
af20: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
af30: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
af40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
af50: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
af60: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
af70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
af80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
af90: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
afa0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
afb0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
afc0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
afd0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
afe0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
aff0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
b000: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
b010: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
b020: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
b030: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
b040: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
b050: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
b060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b070: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
b080: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
b090: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b0a0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b0b0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b0c0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
b0d0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
b0e0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
b0f0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
b100: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
b110: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
b120: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
b130: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b140: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
b150: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b160: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b170: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
b180: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
b190: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
b1a0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
b1b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
b1c0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
b1d0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
b1e0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
b1f0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
b200: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
b210: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b220: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
b230: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
b240: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
b250: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b260: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b270: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b280: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
b290: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
b2a0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
b2b0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
b2c0: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
b2d0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
b2e0: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
b2f0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b300: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
b310: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
b320: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
b330: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
b340: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
b350: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
b360: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
b370: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b380: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
b390: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
b3a0: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
b3b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
b3c0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
b3d0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
b3e0: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
b3f0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b400: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b410: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b420: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b430: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
b440: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
b450: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
b460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b470: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
b480: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b490: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
b4a0: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
b4b0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
b4c0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
b4d0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
b4e0: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
b4f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
b500: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
b510: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  c = sqlite3OsUnl
b520: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
b530: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
b540: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
b550: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
b560: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
b570: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
b580: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
b590: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
b5a0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
b5b0: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
b5c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b5d0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b5e0: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b5f0: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b600: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
b610: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
b620: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
b630: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
b640: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
b650: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
b660: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
b670: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
b680: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b690: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
b6a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b6b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b6c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b6d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
b6e0: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b6f0: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
b700: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
b710: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
b720: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
b730: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b740: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b750: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
b760: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b770: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
b780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b790: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
b7a0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b7b0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b7c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b7d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
b7e0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
b7f0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b800: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
b810: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
b820: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b830: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
b840: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
b850: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
b860: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
b870: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
b880: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
b890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
b8a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
b8b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
b8c0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
b8d0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
b8e0: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
b8f0: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
b900: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
b910: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
b920: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
b930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b950: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
b960: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b970: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
b980: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
b990: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
b9a0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
b9b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
b9c0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
b9d0: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
b9e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
b9f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
ba00: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
ba10: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
ba20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
ba30: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
ba40: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
ba50: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
ba60: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
ba70: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
ba80: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ba90: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
baa0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
bab0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
bac0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
bad0: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
bae0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
baf0: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
bb00: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
bb10: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
bb20: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
bb30: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
bb40: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
bb50: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
bb60: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
bb70: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
bb80: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
bb90: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
bba0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
bbb0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bbc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
bbd0: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
bbe0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
bbf0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
bc00: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
bc10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
bc20: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
bc30: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
bc40: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
bc50: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
bc60: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
bc70: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
bc80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
bcb0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
bcc0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
bcd0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcf0: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
bd00: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
bd30: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
bd40: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
bd50: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
bd60: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
bd70: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
bd80: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
bd90: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
bda0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
bdb0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
bdc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
bdd0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bde0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
bdf0: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
be00: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
be10: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
be20: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
be30: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
be40: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
be50: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
be60: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
be70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
be80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
be90: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
bea0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
beb0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
bec0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
bed0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
bee0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
bef0: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
bf00: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
bf10: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
bf20: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
bf30: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
bf40: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
bf50: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
bf60: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
bf70: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bf80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
bf90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
bfa0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
bfb0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
bfc0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
bfd0: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
bfe0: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
bff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c000: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c010: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c030: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c040: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c050: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c060: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c070: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c080: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c090: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c0a0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c0b0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c0c0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c0d0: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c0e0: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c0f0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c100: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c110: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c120: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c130: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c140: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c150: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c160: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c170: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c180: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c190: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c1a0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c1b0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c1c0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
c1d0: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
c1e0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
c1f0: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
c200: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
c210: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
c220: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
c230: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c240: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
c250: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
c260: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
c270: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
c280: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
c290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c2a0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
c2b0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
c2c0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
c2d0: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
c2e0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
c2f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c300: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
c310: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
c320: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
c330: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
c340: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
c350: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
c360: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
c370: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
c380: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
c390: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
c3a0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
c3b0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
c3c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
c3d0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
c3e0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
c3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
c400: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
c410: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c420: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
c430: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
c440: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
c450: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
c460: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
c470: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
c480: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
c490: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
c4a0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
c4b0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
c4c0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
c4d0: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
c4e0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
c4f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
c500: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
c510: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
c520: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
c530: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
c540: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
c550: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
c560: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
c570: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
c580: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
c590: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
c5a0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
c5b0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
c5c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c5d0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
c5e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
c5f0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
c600: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
c610: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
c620: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
c630: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
c640: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
c650: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
c660: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c670: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
c680: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
c690: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
c6a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c6b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c6c0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
c6e0: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
c6f0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
c700: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
c710: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
c720: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c730: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
c740: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
c750: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
c760: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
c770: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
c780: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
c790: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
c7a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c7b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c7c0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
c7d0: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
c7e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c7f0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
c800: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
c810: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
c820: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c830: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
c840: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c850: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c860: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
c870: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
c880: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
c890: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
c8a0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
c8b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c8c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c8d0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
c8e0: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
c8f0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
c900: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
c910: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c920: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
c950: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
c960: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
c970: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c990: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
c9a0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
c9b0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
c9e0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
c9f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ca00: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
ca10: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
ca20: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
ca30: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
ca40: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
ca50: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ca60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
ca70: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
ca80: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
ca90: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
caa0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
cab0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
cac0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
cad0: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
cae0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
caf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
cb00: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
cb10: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
cb20: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cb30: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cb40: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
cb50: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
cb60: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
cb70: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
cb80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cb90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cba0: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
cbb0: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
cbc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
cbd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
cbe0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
cbf0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
cc00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cc10: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
cc20: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
cc30: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
cc40: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
cc50: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
cc60: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
cc70: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
cc80: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
cc90: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
cca0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
ccb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ccd0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
cce0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
ccf0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
cd00: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
cd10: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
cd20: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
cd30: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
cd40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
cd50: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
cd60: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
cd70: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
cd80: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
cd90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cda0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cdb0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
cdc0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
cdd0: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
cde0: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
cdf0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
ce00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ce10: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
ce20: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
ce30: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ce40: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
ce50: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
ce60: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
ce70: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
ce80: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
ce90: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
cea0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
cef0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
cf00: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
cf10: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
cf30: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
cf60: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
cf70: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
cf80: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
cf90: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
cfa0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
cfb0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
cfc0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
cfd0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
cfe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cff0: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
d000: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
d010: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d020: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
d030: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
d040: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d050: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d060: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d070: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d080: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d090: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d0b0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d0c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d0d0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d0e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d0f0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d110: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d120: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d130: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d140: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d150: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d160: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d170: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d180: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d190: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d1a0: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d1b0: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d1c0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d1d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d1e0: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d1f0: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d200: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d210: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d220: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d230: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d240: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
d250: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
d260: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
d270: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
d280: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
d290: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
d2a0: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
d2b0: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
d2c0: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
d2d0: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
d2e0: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
d2f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
d300: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
d310: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
d320: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
d330: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
d340: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
d350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
d360: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
d370: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
d380: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d390: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d3a0: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
d3b0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
d3c0: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
d3d0: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
d3e0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
d3f0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
d400: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
d410: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
d420: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
d430: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d440: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
d450: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
d460: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
d470: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
d480: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
d490: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
d4a0: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
d4b0: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
d4c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d4f0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d500: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
d510: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
d520: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d530: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
d540: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
d550: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d560: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
d570: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d580: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
d590: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
d5a0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
d5b0: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
d5c0: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
d5d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d5e0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d5f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
d600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d610: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
d620: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
d630: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
d640: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d650: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
d660: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
d670: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
d680: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d690: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
d6a0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
d6b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d6c0: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
d6d0: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
d6e0: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
d6f0: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
d700: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
d710: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
d720: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
d730: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
d740: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
d750: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
d760: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
d770: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
d780: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
d790: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
d7a0: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
d7b0: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
d7c0: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
d7d0: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
d7e0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
d7f0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
d800: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
d810: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
d820: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
d830: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
d840: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
d850: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
d860: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
d870: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
d880: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
d890: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
d8a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
d8b0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
d8c0: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
d8d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d8e0: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
d8f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d900: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d910: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
d920: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
d930: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
d940: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
d950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
d960: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
d970: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d980: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
d990: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
d9a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
d9b0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
d9c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
d9d0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
d9e0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
d9f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
da00: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
da10: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
da20: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
da30: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
da40: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
da50: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
da60: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
da70: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
da80: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
da90: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
daa0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
dab0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
dac0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
dad0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
dae0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
daf0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
db00: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
db10: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
db20: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
db30: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
db40: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
db50: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
db60: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
db70: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
db80: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
db90: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
dba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
dbb0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
dbc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
dbd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dbe0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dbf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
dc00: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
dc10: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
dc20: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
dc30: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
dc40: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
dc50: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
dc60: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
dc70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
dc80: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
dc90: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
dca0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
dcb0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcd0: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
dce0: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
dcf0: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dd20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
dd30: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
dd40: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
dd50: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
dd60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
dd70: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
dd80: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
dd90: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
dda0: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
ddb0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ddc0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
ddd0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
dde0: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
ddf0: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
de00: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
de10: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
de20: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
de30: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
de40: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
de50: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
de60: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
de70: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
de80: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
de90: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
dea0: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
deb0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dec0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
dee0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
def0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
df00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df10: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
df20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
df30: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
df40: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
df50: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
df60: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
df70: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
df80: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
df90: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
dfa0: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
dfb0: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
dfc0: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
dfd0: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
dfe0: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
dff0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e000: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e010: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e020: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e030: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e040: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e050: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e060: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e070: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e080: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e090: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e0a0: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e0b0: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e0c0: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e0d0: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e0e0: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e0f0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e100: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e110: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e120: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e130: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e140: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e150: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e160: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e170: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e180: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e190: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e1a0: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e1b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e1c0: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e1d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e1e0: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e1f0: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e200: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e210: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e220: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e230: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e240: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
e250: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
e260: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
e270: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
e280: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
e290: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
e2a0: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
e2b0: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
e2c0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e2d0: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
e2e0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
e2f0: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
e300: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
e310: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
e320: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
e330: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
e340: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
e350: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e360: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
e370: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e380: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e390: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
e3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
e3b0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
e3c0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
e3d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
e3e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e3f0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
e400: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e410: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
e420: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
e430: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
e440: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e450: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
e460: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e470: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e480: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
e490: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
e4a0: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
e4b0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
e4c0: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
e4d0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
e4e0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
e4f0: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
e500: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
e510: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
e520: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
e530: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e540: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
e550: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e560: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
e570: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
e580: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
e590: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
e5a0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
e5b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e5c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e5d0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
e5e0: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
e5f0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
e600: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
e610: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
e620: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e630: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e640: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
e650: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
e660: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
e670: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
e680: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e690: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e6a0: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
e6b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
e6c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
e6d0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
e6e0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
e6f0: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
e700: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
e710: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
e720: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
e730: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
e740: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
e750: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
e760: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
e770: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
e780: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
e790: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
e7a0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
e7b0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
e7c0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
e7d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e7e0: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
e7f0: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
e800: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e810: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
e820: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
e830: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
e840: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
e850: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
e860: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
e870: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
e880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
e890: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
e8a0: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
e8b0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
e8c0: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
e8d0: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
e8e0: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
e8f0: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
e900: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
e910: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
e920: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
e930: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
e940: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
e950: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
e960: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
e970: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
e980: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
e990: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
e9a0: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
e9b0: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
e9c0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
e9d0: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
e9e0: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
e9f0: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
ea00: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
ea10: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
ea20: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
ea30: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
ea40: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
ea50: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
ea60: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
ea70: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
ea80: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
ea90: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
eaa0: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
eab0: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
eac0: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
ead0: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
eae0: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
eaf0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
eb00: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
eb10: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
eb20: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
eb30: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
eb40: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
eb50: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
eb60: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
eb70: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
eb80: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
eb90: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
eba0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
ebb0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
ebc0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
ebd0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
ebe0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ebf0: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
ec00: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
ec10: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
ec20: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ec30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ec40: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
ec50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ec60: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
ec70: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
ec80: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
ec90: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
eca0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
ecb0: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
ecc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
ecd0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
ece0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
ecf0: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
ed00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ed10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ed20: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
ed30: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
ed40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
ed50: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
ed60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
ed70: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
ed80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
ed90: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
eda0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
edb0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
edc0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
edd0: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
ede0: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
edf0: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
ee00: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
ee10: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
ee20: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
ee30: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
ee40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
ee50: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
ee60: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
ee70: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
ee80: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
ee90: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
eea0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
eeb0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
eec0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
eed0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
eee0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
eef0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
ef00: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
ef10: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
ef20: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
ef30: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
ef40: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
ef50: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
ef60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ef70: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
ef80: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
ef90: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
efa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
efb0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
efc0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
efd0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
efe0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
eff0: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f000: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f010: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f020: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f030: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f040: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f050: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f060: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f070: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f080: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f090: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0b0: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f0c0: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f0d0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f0f0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f110: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f120: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f130: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f140: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f150: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f160: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f190: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f1a0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f1b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f1e0: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f1f0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f200: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f210: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f220: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f230: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f250: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
f260: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
f270: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
f280: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f290: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
f2a0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
f2b0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
f2c0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
f2d0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
f2e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f2f0: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
f300: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
f310: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
f320: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
f330: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
f340: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
f350: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
f360: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
f370: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
f380: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
f390: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
f3a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f3b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
f3c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f3d0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
f3e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f3f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
f400: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
f410: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
f420: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
f430: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
f440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f450: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
f460: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
f470: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
f480: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
f490: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
f4a0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
f4b0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
f4c0: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
f4d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
f4e0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
f4f0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
f500: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
f510: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
f520: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
f530: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
f540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f550: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
f560: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
f570: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
f580: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
f590: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f5a0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
f5b0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
f5c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
f5d0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
f5e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
f5f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f610: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
f620: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
f630: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
f640: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
f650: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
f660: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
f670: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
f680: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
f690: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
f6a0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f6b0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
f6c0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
f6d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
f6e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
f6f0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f700: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f710: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
f720: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
f730: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f740: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f750: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f760: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
f770: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
f780: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f790: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f7a0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f7b0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
f7c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f7d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
f7e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
f7f0: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
f800: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
f810: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
f820: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
f830: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
f840: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
f850: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
f860: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
f870: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f880: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
f890: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
f8a0: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
f8b0: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
f8c0: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
f8d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f8e0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f8f0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f900: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
f910: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
f920: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
f930: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f940: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f950: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
f960: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
f970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f980: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
f990: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
f9a0: 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
f9b0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
f9c0: 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
f9d0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f9e0: 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
f9f0: 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
fa00: 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
fa10: 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
fa20: 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
fa30: 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
fa40: 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
fa50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
fa60: 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
fa70: 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
fa80: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fa90: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
faa0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
fab0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
fac0: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
fad0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
fae0: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
faf0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
fb00: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
fb10: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
fb20: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
fb30: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
fb40: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
fb50: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
fb60: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
fb70: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
fb80: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
fb90: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
fba0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
fbb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
fbc0: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
fbd0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
fbe0: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
fbf0: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
fc00: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
fc10: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
fc20: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
fc30: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
fc40: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
fc50: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
fc60: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
fc70: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
fc80: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
fc90: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
fca0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
fcb0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
fcc0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fcd0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
fce0: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
fcf0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
fd00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
fd10: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
fd20: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
fd30: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
fd40: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
fd50: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
fd60: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
fd70: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
fd80: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
fd90: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
fda0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
fdb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
fdc0: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
fdd0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
fde0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
fdf0: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
fe00: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
fe10: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
fe20: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
fe30: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
fe40: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
fe50: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
fe60: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
fe70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
fe80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
fe90: 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
fea0: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
feb0: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
fec0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
fed0: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
fee0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
fef0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
ff00: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
ff10: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
ff20: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
ff30: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
ff40: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
ff50: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
ff60: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
ff70: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
ff80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
ff90: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
ffa0: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
ffb0: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
ffc0: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
ffd0: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
ffe0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
fff0: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10000 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10010 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10020 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
10030 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
10040 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10050 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10060 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10070 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10080 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10090 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
100a0 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
100b0 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
100c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
100d0 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
100e0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
100f0 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10100 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10110 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10120 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
10130 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
10140 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10150 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10160 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10180 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10190 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
101a0 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
101b0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
101c0 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
101d0 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
101e0 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
101f0 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10200 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10210 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10220 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
10230 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
10240 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10250 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10260 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10270 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
10280 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10290 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
102a0 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
102b0 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
102c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
102d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
102e0 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
102f0 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10300 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10310 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10320 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
10330 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
10340 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
10350 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
10360 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
10370 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
10380 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10390 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
103a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
103b0 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
103c0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
103d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
103e0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
103f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10400 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10410 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10440 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10450 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10480 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10490 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
104c0 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
104d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
104e0 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10500 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10510 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10520 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10550 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10560 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10570 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10580 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10590 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
105a0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
105b0 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
105c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
105d0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
105e0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
105f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10600 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
10610 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
10620 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10640 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10650 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10660 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
10670 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
10680 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10690 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
106a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
106b0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
106c0 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
106d0 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
106e0 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
106f0 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
10700 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
10710 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
10720 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
10730 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
10740 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
10750 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10760 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
10770 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
10780 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
10790 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
107b0 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
107c0 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
107d0 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
107e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
107f0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
10800 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
10810 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
10820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
10830 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
10840 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
10850 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
10860 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10870 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10880 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
10890 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
108a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
108b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
108c0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
108d0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
108e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
108f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
10900 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
10910 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10920 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10930 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
10940 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
10950 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
10970 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
10980 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
10990 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
109a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
109b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
109c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
109d0 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
109e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
109f0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10a00 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10a10 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10a20 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
10a30 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10a40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10a50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
10a60 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64  nalMagic, 8, iHd
10a70 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
10a80 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
10a90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
10aa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10ab0 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
10ac0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
10ad0 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
10ae0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
10af0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
10b00 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
10b10 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
10b20 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
10b30 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
10b40 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
10b50 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
10b60 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
10b70 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
10b80 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
10b90 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
10ba0 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
10bb0 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
10bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
10bd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
10be0 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
10bf0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
10c00 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
10c10 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
10c20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
10c30 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
10c40 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
10c50 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
10c60 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
10c70 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
10c80 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
10c90 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
10ca0 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
10cb0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
10cc0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10cd0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
10ce0 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
10cf0 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
10d10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10d20 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
10d30 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
10d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
10d50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
10d70 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
10d80 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
10d90 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
10da0 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
10db0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
10dc0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
10dd0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10de0 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
10df0 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
10e00 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
10e10 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
10e20 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
10e30 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10e60 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
10e70 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
10e80 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
10e90 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
10ea0 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
10eb0 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
10ec0 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
10ed0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
10ee0 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
10ef0 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
10f00 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
10f10 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
10f20 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
10f30 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
10f40 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
10f50 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
10f60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10f70 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
10f80 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
10f90 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
10fa0 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
10fb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  ){.  sqlite3Back
10fc0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
10fd0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
10fe0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
10ff0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11000 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
11010 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11020 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11030 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11040 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11050 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11060 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11070 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11080 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11090 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
110a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
110b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
110c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
110d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
110e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
110f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11100 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11120 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11130 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11140 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11150 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11160 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11170 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11180 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11190 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
111a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
111b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
111c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
111d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
111e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
111f0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11200 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11210 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11220 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11230 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11240 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11250 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11260 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11270 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11280 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11290 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
112a0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
112b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
112c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
112d0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
112e0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
112f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11310 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11320 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11330 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11340 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11350 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11360 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11370 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11380 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11390 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
113a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
113b0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
113c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
113d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
113e0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
113f0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11400 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11410 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11420 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11430 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11440 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11450 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11460 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11470 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11480 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
114a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
114b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
114c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
114d0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
114e0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
114f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11500 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11510 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11520 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11530 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11540 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11550 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11560 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11570 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11580 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11590 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
115a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
115b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
115c0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
115d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
115e0 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
115f0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11600 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11610 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11620 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11630 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11640 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11650 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11670 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11680 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11690 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
116a0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
116b0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
116c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
116d0 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
116e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
116f0 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11700 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11710 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11720 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11730 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11740 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11750 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11760 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11770 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11780 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11790 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
117a0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
117b0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
117c0 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
117d0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
117e0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
117f0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11800 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11810 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11820 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11830 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11840 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11850 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11860 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11870 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11880 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11890 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
118a0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
118b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
118c0 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
118d0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
118e0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
118f0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
11900 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
11910 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11920 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11930 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11940 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11950 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11960 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11980 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11990 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
119a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
119b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
119c0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
119d0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
119e0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
119f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11a10 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11a20 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11a30 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
11a40 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
11a50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
11a60 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11a70 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
11a80 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
11a90 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
11aa0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
11ab0 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
11ac0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
11ad0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
11ae0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11af0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
11b00 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
11b10 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
11b20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11b30 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
11b40 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
11b50 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
11b60 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
11b70 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
11b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11b90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11ba0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
11bb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11bc0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11bd0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
11be0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11bf0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11c00 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
11c10 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11c20 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11c30 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
11c40 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11c50 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
11c70 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
11c80 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11c90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
11ca0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
11cb0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
11cc0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
11cd0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
11ce0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
11cf0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
11d00 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
11d10 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
11d20 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11d30 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
11d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
11d50 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
11d60 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
11d70 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
11d80 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
11d90 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
11da0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
11db0 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
11dc0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
11dd0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
11de0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
11df0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
11e00 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
11e10 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
11e20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
11e30 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
11e40 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
11e50 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
11e60 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
11e70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
11e80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e90 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
11ea0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
11eb0 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
11ec0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
11ed0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
11ee0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
11ef0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
11f00 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
11f10 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
11f20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
11f30 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
11f40 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
11f50 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
11f60 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
11f70 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
11f80 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
11f90 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
11fa0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11fb0 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
11fc0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
11fd0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
11fe0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
11ff0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12000 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12010 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12020 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12030 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12040 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12050 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12060 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12070 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12080 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12090 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
120a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
120b0 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
120c0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
120d0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
120e0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
120f0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12100 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12110 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12120 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
12130 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12140 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12150 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12160 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12180 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12190 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
121a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
121b0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
121c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
121d0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
121e0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  K;.  }..  pPager
121f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
12200 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
12210 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50  nalHdr = 0;.  pP
12220 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
12230 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
12240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12250 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
12260 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20  n IOERR or FULL 
12270 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69  error that requi
12280 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  res.** the pager
12290 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69   to transition i
122a0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
122b0 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63  ate may ahve occ
122c0 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69  urred..** The fi
122d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
122e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
122f0 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
12300 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  , the second .**
12310 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
12320 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
12330 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
12340 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  API function. Th
12350 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  e .** value retu
12360 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
12370 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
12380 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
12390 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
123a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
123b0 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
123c0 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45  FULL, SQLITE_IOE
123d0 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  RR or one of the
123e0 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f  .** IOERR sub-co
123f0 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65  des, the pager e
12400 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20  nters the ERROR 
12410 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72  state and the er
12420 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73  ror code.** is s
12430 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65  tored in Pager.e
12440 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68  rrCode. While th
12450 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20  e pager remains 
12460 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
12470 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72  te,.** all major
12480 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
12490 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  e Pager will imm
124a0 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
124b0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a  Pager.errCode..*
124c0 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73  *.** The ERROR s
124d0 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74  tate indicates t
124e0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
124f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12500 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
12510 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
12520 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
12530 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
12540 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
12550 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
12560 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12570 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
12580 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
12590 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
125a0 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
125b0 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
125c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
125d0 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
125e0 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
125f0 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
12600 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
12610 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
12620 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
12630 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
12640 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
12650 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
12660 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
12670 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
12680 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
12690 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
126a0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
126b0 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
126c0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
126d0 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
126e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
126f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
12700 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
12710 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
12720 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
12730 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
12740 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
12750 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
12760 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12770 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
12780 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12790 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  AGER_ERROR;.  }.
127a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
127b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
127c0 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
127d0 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
127e0 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
127f0 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
12800 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
12810 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
12820 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
12830 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
12840 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
12850 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
12860 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
12870 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
12880 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
12890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
128a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
128b0 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
128c0 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
128d0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
128e0 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ion..** .** This
128f0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
12900 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45  r called in PAGE
12910 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
12920 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a  f it is called.*
12930 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20  * in PAGER_NONE 
12940 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  or PAGER_SHARED 
12950 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f  state and the lo
12960 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a  ck held is less.
12970 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61  ** exclusive tha
12980 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
12990 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  k, it is a no-op
129a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
129b0 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
129c0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
129d0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
129e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
129f0 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
12a00 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
12a10 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
12a20 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
12a30 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
12a40 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
12a50 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
12a60 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
12a70 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
12a80 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
12a90 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
12aa0 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
12ab0 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
12ac0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12ad0 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
12ae0 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
12af0 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
12b00 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
12b10 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
12b20 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
12b30 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
12b40 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
12b50 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
12b60 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
12b70 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
12b80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
12b90 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
12ba0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12bb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12bc0 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
12bd0 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
12be0 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
12bf0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
12c00 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12c10 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
12c20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
12c30 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
12c40 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
12c50 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12c60 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
12c70 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
12c80 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
12c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
12ca0 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
12cb0 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
12cc0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
12cd0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
12ce0 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
12cf0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
12d00 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
12d10 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
12d20 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
12d30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
12d40 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
12d50 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
12d60 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
12d70 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
12d80 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
12d90 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12da0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
12db0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12dc0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12dd0 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
12de0 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
12df0 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
12e00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
12e10 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
12e20 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
12e30 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
12e40 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
12e50 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
12e60 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
12e70 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
12e80 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
12e90 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12ea0 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
12eb0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
12ec0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
12ed0 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65  alized, the page
12ee0 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  r moves to PAGER
12ef0 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a  _READER state..*
12f00 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
12f10 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f  non-exclusive ro
12f20 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65  llback mode, the
12f30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
12f40 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61  e is .** downgra
12f50 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f  ded to a SHARED_
12f60 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
12f70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
12f80 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
12f90 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
12fa0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  r occurs during.
12fb0 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f  ** any of the IO
12fc0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66   operations to f
12fd0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
12fe0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f  nal file or unlo
12ff0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
13000 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  se then the IO e
13010 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13020 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
13030 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70  r. If the .** op
13040 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c  eration to final
13050 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13060 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e  file fails, then
13070 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a   the code still.
13080 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f  ** tries to unlo
13090 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
130a0 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65  file if not in e
130b0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49  xclusive mode. I
130c0 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20  f the.** unlock 
130d0 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20  operation fails 
130e0 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68  as well, then th
130f0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f  e first error co
13100 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f  de related.** to
13110 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
13120 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68   encountered (th
13130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  e journal finali
13140 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a  zation one) is.*
13150 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
13160 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13170 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
13190 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20  nt hasMaster){. 
131a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
131b0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
131c0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
131d0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
131e0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
131f0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
13200 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
13210 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
13220 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
13230 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ation */..  /* D
13240 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  o nothing if the
13250 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
13260 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
13270 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te transaction. 
13280 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20   ** or at least 
13290 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
132a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
132b0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ay be called whe
132c0 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  n there.  ** is 
132d0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
132e0 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20  tion active but 
132f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
13300 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20  eater lock is.  
13310 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77  ** held under tw
13320 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
13330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
13340 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  After a successf
13350 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ul hot-journal r
13360 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63  ollback, it is c
13370 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
13380 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47       eState==PAG
13390 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63  ER_NONE and eLoc
133a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
133b0 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  K..  **.  **   2
133c0 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  . If a connectio
133d0 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d  n with locking_m
133e0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f  ode=exclusive ho
133f0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
13400 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f  VE .  **      lo
13410 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b  ck switches back
13420 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   to locking_mode
13430 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e  =normal and then
13440 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a   executes a.  **
13450 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
13460 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e  action, this fun
13470 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13480 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47  with eState==PAG
13490 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20  ER_READER .  ** 
134a0 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d       and eLock==
134b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77  EXCLUSIVE_LOCK w
134c0 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61  hen the read-tra
134d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
134e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
134f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
13500 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
13510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13520 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
13530 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20  _ERROR );.  if( 
13540 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
13550 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
13560 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  ED && pPager->eL
13570 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
13580 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
13590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
135a0 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
135b0 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
135c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
135d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
135e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
135f0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
13600 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13610 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
13620 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
13630 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
13640 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
13650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
13660 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13670 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
13680 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
136a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
136b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
136c0 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
136d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
136e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
136f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13700 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13710 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13720 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
13730 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
13740 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
13750 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
13790 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
137a0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
137b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
137c0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
137d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
137e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
137f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13800 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
13810 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
13820 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
13830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13840 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
13850 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
13860 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
13870 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
13880 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
13890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
138a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
138b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
138c0 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
138d0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
138e0 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
138f0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
13900 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
13910 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
13920 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
13930 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
13940 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
13950 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
13960 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
13970 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
13980 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
13990 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
139a0 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
139b0 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
139c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
139d0 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  al. .      */.  
139e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
139f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13a10 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13a20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13a30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a50 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13a60 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13a70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13a90 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13aa0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13ab0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13ac0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
13ad0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13af0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13b00 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
13b10 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
13b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
13b40 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
13b50 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
13b60 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
13b70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
13b80 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
13b90 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
13ba0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
13bb0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
13bc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
13bd0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13be0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
13bf0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
13c00 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
13c10 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
13c30 65 72 55 6e 72 65 66 28 70 29 3b 0a 20 20 20 20  erUnref(p);.    
13c40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13c50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
13c60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
13c70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
13c80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
13c90 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
13ca0 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
13cb0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
13cc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13cd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13ce0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
13cf0 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
13d00 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69  r->dbSize);..  i
13d10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
13d20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
13d30 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72   Drop the WAL wr
13d40 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79  ite-lock, if any
13d50 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63  . Also, if the c
13d60 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e  onnection was in
13d70 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   .    ** locking
13d80 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13d90 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
13da0 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20  onger, drop the 
13db0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a  EXCLUSIVE .    *
13dc0 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  * lock held on t
13dd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32  ..    */.    rc2
13df0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64   = sqlite3WalEnd
13e00 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
13e10 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
13e20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d      assert( rc2=
13e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13e40 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
13e50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
13e60 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
13e70 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
13e80 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
13e90 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
13ea0 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
13eb0 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
13ec0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
13ed0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
13ee0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13ef0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
13f00 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
13f10 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
13f20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
13f30 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
13f40 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
13f50 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
13f60 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
13f70 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
13f80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
13f90 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
13fa0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
13fb0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
13fc0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
13fd0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
13fe0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
13ff0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
14000 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
14010 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14020 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14030 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
14040 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14050 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14060 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14070 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14080 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14090 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
140a0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
140b0 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
140c0 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
140d0 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
140e0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
140f0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14100 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14110 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14120 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14130 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
14140 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14150 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14160 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14170 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14180 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14190 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
141a0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
141b0 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
141c0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
141d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
141e0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
141f0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14200 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14210 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14220 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14230 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
14240 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14250 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14260 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14270 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14280 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14290 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
142a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
142b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
142c0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
142d0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
142e0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
142f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14300 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14310 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14320 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14330 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14340 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14350 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14360 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14380 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
143a0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
143b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
143c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
143d0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
143e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
143f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14400 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14410 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14420 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
14430 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14440 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14460 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14470 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14480 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14490 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
144a0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
144b0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
144c0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
144d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
144e0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
144f0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
14500 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
14510 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
14520 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
14530 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
14540 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
14550 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
14560 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
14570 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
14580 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
14590 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
145a0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
145b0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
145c0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
145d0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
145e0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
145f0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
14600 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
14610 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
14620 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
14630 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
14640 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
14650 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
14660 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
14670 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
14680 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
14690 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
146a0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
146b0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
146c0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
146d0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
146e0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
146f0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
14700 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
14710 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
14720 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
14730 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
14740 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
14750 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
14760 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
14770 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
14780 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
14790 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
147a0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
147b0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
147c0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
147d0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
147e0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
147f0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
14800 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
14810 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
14820 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
14830 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
14840 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
14850 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
14860 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
14870 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
14880 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
14890 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
148a0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
148b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
148c0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
148d0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
148e0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
148f0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
14900 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
14910 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
14920 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
14930 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
14940 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
14950 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
14960 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
14970 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
14980 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
14990 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
149a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
149b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
149c0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
149d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
149e0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
149f0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
14a00 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
14a30 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
14a40 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
14a50 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
14a60 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
14a70 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
14a80 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
14a90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
14aa0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
14ab0 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
14ac0 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
14ad0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
14ae0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
14af0 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
14b00 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
14b10 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
14b20 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
14b30 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
14b40 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
14b50 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
14b60 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
14b70 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
14b80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
14b90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
14ba0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
14bb0 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
14bc0 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
14bd0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
14be0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
14bf0 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
14c00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14c10 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
14c20 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
14c30 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14c40 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
14c50 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
14c60 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
14c70 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
14c80 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
14c90 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
14ca0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
14cb0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
14cc0 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
14cd0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
14ce0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
14cf0 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
14d00 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
14d10 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
14d20 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
14d30 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
14d40 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
14d50 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
14d60 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
14d70 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
14d80 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
14d90 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
14da0 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
14db0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
14dc0 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
14dd0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
14de0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
14df0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
14e00 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
14e10 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
14e20 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14e30 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
14e40 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
14e50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14e60 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
14e70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
14e80 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
14e90 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
14ea0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14eb0 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
14ec0 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
14ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
14ee0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
14ef0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14f00 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
14f10 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
14f20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
14f30 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f40 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
14f50 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
14f60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
14f70 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
14f80 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
14f90 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
14fa0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
14fb0 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
14fc0 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
14fd0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
14fe0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
14ff0 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
15000 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
15010 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
15020 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
15030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15040 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
15050 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
15060 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
15070 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
15080 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
15090 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
150a0 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
150b0 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
150c0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
150d0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
150e0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
150f0 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
15100 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
15110 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15120 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15130 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
15140 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
15150 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
15160 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
15170 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
15180 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15190 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
151a0 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
151b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
151c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
151d0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
151e0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
151f0 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15210 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
15220 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
15230 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
15260 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
15270 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
15280 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
152a0 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
152b0 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
152c0 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
152d0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
152e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
152f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15300 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
15310 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
15320 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
15330 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
15340 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
15350 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
15360 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
15370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15380 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15390 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
153a0 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
153b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
153c0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
153d0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
153e0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
153f0 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15410 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
15420 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
15430 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
15440 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
15450 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
15460 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
15470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
15480 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
154b0 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
154c0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
154d0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
154e0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
154f0 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
15500 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
15510 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
15520 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
15530 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
15540 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
15550 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
15560 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
15570 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
15580 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
15590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
155a0 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
155b0 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
155c0 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
155d0 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
155e0 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
155f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
15600 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
15620 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
15630 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
15640 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
15650 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
15660 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
15670 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
15680 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
15690 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
156a0 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
156b0 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
156c0 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
156d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
156e0 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
156f0 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
15700 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
15710 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
15720 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
15730 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
15740 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
15750 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
15760 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
15770 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
15780 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
15790 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
157a0 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
157b0 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
157c0 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
157d0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
157e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
157f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15800 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15810 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15820 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
15830 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
15840 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
15850 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
15870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
15880 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
15890 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
158a0 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
158b0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
158c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
158d0 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
158e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
158f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
15900 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
15910 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
15920 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
15930 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15940 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
15950 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
15960 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
15970 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
15980 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
15990 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
159a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
159b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
159c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
159d0 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
159e0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
159f0 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
15a00 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
15a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
15a30 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
15a40 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
15a50 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
15a60 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
15a70 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
15a80 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
15a90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
15aa0 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
15ab0 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
15ac0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
15ad0 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
15ae0 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
15af0 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
15b00 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
15b10 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
15b20 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
15b30 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
15b40 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
15b50 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
15b60 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
15b70 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
15b80 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
15b90 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
15ba0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
15bb0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
15bc0 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
15bd0 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
15be0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
15bf0 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
15c00 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
15c10 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
15c20 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
15c30 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
15c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15c50 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
15c60 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
15c70 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
15c80 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
15c90 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
15ca0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15cb0 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
15cc0 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
15cd0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
15ce0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
15cf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15d00 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
15d10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
15d20 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
15d30 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79  y been played by
15d40 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
15d50 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
15d60 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
15d70 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
15d80 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
15d90 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
15da0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
15db0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
15dc0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
15dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15de0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
15df0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
15e00 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
15e10 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
15e20 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
15e30 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
15e40 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15e50 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
15e60 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
15e70 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
15e80 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
15e90 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
15ea0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
15eb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
15ec0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
15ed0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
15ee0 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
15ef0 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
15f00 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
15f10 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
15f20 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
15f30 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
15f40 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
15f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
15f60 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
15f70 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
15f80 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
15f90 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
15fa0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
15fb0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
15fc0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
15fd0 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
15fe0 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
15ff0 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
16000 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
16010 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
16020 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
16030 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16040 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
16050 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
16060 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
16070 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
16080 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
16090 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
160a0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
160b0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
160c0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
160d0 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
160e0 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
160f0 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
16100 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
16110 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
16120 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
16130 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
16140 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
16150 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
16160 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
16170 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
16180 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
16190 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
161a0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
161b0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
161c0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
161d0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
161e0 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
161f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16200 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
16210 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16220 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
16230 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
16240 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
16250 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
16260 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
16270 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
16280 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
16290 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
162a0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
162b0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
162c0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
162d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
162e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
162f0 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
16300 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
16310 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
16320 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
16330 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16340 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
16350 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
16360 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
16370 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
16380 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
16390 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
163a0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
163b0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
163c0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
163d0 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
163e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
163f0 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
16400 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
16410 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16420 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
16430 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
16440 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
16450 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
16460 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
16470 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
16480 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
16490 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
164a0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
164b0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
164c0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
164d0 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
164e0 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
164f0 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
16500 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
16510 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
16520 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
16530 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
16540 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
16550 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
16560 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
16570 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
16580 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
16590 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
165a0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
165b0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
165c0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
165d0 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
165e0 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
165f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
16600 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
16610 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
16620 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
16630 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
16640 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
16650 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
16660 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
16670 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
16680 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
16690 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
166a0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
166b0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
166c0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
166d0 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
166e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
166f0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
16700 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
16710 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
16720 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
16730 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
16740 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
16750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16760 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
16770 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20   || pPg==0 );.  
16780 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
16790 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
167a0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
167b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
167c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
167d0 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
167e0 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
167f0 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
16800 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
16810 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
16820 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
16830 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
16840 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
16850 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
16860 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
16870 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
16880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
16890 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
168a0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
168b0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
168c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
168d0 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
168e0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
168f0 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
16900 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16910 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
16920 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
16930 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
16940 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
16950 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
16960 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
16970 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
16980 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
16990 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
169a0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
169b0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
169c0 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
169d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
169e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
169f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
16a00 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
16a10 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
16a20 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16a30 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
16a40 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
16a50 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
16a60 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
16a70 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
16a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16a90 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
16aa0 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
16ab0 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16ac0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
16ad0 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
16ae0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
16af0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
16b00 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
16b10 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
16b20 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
16b30 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
16b40 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
16b50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
16b60 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
16b70 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
16b80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16b90 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
16ba0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
16bb0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
16bc0 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
16bd0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
16be0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16bf0 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
16c00 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
16c10 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
16c20 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
16c30 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
16c40 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
16c50 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
16c60 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
16c70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
16c80 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
16c90 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
16ca0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
16cb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
16cc0 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
16cd0 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
16ce0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
16cf0 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
16d00 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
16d10 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
16d20 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
16d30 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
16d40 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
16d50 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
16d60 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
16d70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16d80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
16d90 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
16da0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
16db0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
16dc0 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
16dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
16de0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
16df0 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
16e00 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
16e10 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
16e20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
16e30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
16e40 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
16e50 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
16e60 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
16e70 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
16e80 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
16e90 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
16ea0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
16eb0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
16ec0 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
16ed0 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
16ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16ef0 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
16f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
16f10 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
16f30 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b  r->doNotSpill++;
16f40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16f50 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50  3PagerAcquire(pP
16f60 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
16f70 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
16f80 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
16f90 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pill==1 );.    p
16fa0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
16fb0 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21  l--;.    if( rc!
16fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d  urn rc;.    pPg-
16fe0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
16ff0 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
17000 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
17010 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
17020 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
17030 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
17040 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
17050 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
17060 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
17070 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
17080 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
17090 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
170a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
170b0 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
170c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
170d0 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
170e0 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
170f0 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
17100 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
17110 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
17120 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
17130 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
17140 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
17150 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
17160 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
17170 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
17180 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
17190 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
171a0 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
171b0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
171c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
171d0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
171e0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
171f0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
17200 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
17210 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
17220 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
17230 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
17240 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
17250 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
17260 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
17270 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
17280 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17290 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
172a0 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
172b0 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
172c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
172d0 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
172e0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
172f0 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
17300 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
17310 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
17320 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
17330 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
17340 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  out to the.     
17350 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
17360 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17370 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
17380 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
17390 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
173a0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
173b0 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
173c0 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
173d0 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
173e0 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
173f0 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
17400 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
17410 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
17420 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17430 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
17440 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
17450 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
17460 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
17470 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
17480 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
17490 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
174a0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
174b0 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
174c0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
174d0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
174e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
174f0 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
17500 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
17510 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
17520 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17530 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
17540 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
17550 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
17560 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
17570 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
17580 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
17590 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
175a0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
175b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
175c0 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
175d0 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
175e0 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
175f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
17600 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
17610 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17620 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
17630 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
17640 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
17650 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
17660 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
17670 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
17680 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
17690 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
176a0 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
176b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
176c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
176d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  er) );.      sql
176e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
176f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
17700 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
17710 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
17720 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
17730 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
17740 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
17750 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
17760 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
17770 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
17780 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
17790 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
177a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
177b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
177c0 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
177d0 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
177e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
177f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
17800 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
17810 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
17820 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
17830 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
17840 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
17850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17860 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17870 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
17880 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17890 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
178a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
178b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
178c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
178d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
178e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
178f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
17900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17910 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
17920 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
17930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
17940 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
17950 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
17960 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17970 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
17980 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
17990 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
179a0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
179b0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
179c0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
179d0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
179e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
179f0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
17a00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
17a10 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
17a20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
17a30 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
17a40 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
17a50 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
17a60 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
17a70 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
17a80 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
17a90 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
17aa0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
17ab0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
17ac0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
17ad0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
17ae0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
17af0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
17b00 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
17b10 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
17b20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
17b30 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
17b40 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
17b50 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
17b60 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
17b70 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
17b80 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
17b90 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
17ba0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
17bb0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
17bc0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
17bd0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
17be0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
17bf0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
17c00 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
17c10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
17c20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
17c30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17c40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
17c50 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
17c60 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
17c70 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
17c80 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
17c90 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
17ca0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
17cb0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
17cc0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
17cd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17ce0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
17cf0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
17d00 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17d10 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
17d20 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
17d30 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
17d40 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
17d50 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
17d60 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
17d70 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
17d80 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
17d90 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
17da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
17db0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
17dc0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
17dd0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
17de0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
17df0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17e00 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
17e10 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
17e20 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
17e30 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
17e40 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
17e50 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
17e60 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
17e70 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
17e80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
17e90 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
17ea0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
17eb0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
17ec0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
17ed0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
17ee0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
17ef0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
17f00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
17f10 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
17f20 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
17f30 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
17f40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
17f50 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
17f60 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
17f70 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
17f80 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
17f90 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
17fa0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17fb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17fc0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
17fd0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
17fe0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
17ff0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
18000 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
18010 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
18020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18030 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
18040 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
18050 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18060 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18070 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
18080 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
180b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
180c0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
180d0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
180e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
180f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
18110 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
18120 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
18130 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18140 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
18150 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
18160 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
18170 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18180 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
18190 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
181a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
181b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
181c0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
181d0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
181e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
181f0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
18200 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
18210 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
18220 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
18230 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
18240 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
18250 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18260 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
18270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
18280 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
18290 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
182a0 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
182b0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
182c0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
182d0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
182e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
182f0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
18300 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
18310 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18320 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
18330 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
18340 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
18350 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
18360 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
18370 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
18380 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
18390 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
183a0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
183b0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
183c0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
183d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
183e0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
183f0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
18400 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
18410 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
18420 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
18430 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
18440 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18450 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
18460 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
18470 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
18480 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18490 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
184a0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
184b0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
184c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
184d0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
184e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
184f0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
18500 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
18510 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
18520 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
18530 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
18540 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
18550 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
18560 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
18570 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
18580 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
18590 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
185a0 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
185b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
185c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
185d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
185e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
185f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18600 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
18610 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
18620 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
18630 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
18640 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
18650 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
18660 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
18670 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
18680 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
18690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
186a0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  M;.    goto delm
186b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20  aster_out;.  }. 
186c0 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
186d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
186e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b  asterJournal+1];
186f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18700 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
18710 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
18720 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
18730 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  al, 0);.  if( rc
18740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18750 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18760 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
18770 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
18780 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72  l] = 0;..  zJour
18790 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
187a0 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  rnal;.  while( (
187b0 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
187c0 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
187d0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
187e0 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72  nt exists;.    r
187f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
18800 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
18810 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
18820 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
18830 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
18840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18850 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
18860 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
18870 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
18880 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
18890 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
188a0 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
188b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
188c0 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70  sts..      ** Op
188d0 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
188e0 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
188f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18900 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  al. If.      ** 
18910 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
18920 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
18930 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18940 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
18950 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
18960 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18970 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18980 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18990 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
189a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
189b0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
189c0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
189d0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
189e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
189f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
18a00 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a10 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
18a20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
18a30 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
18a40 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
18a50 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
18a60 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18a70 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
18a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
18aa0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18ab0 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
18ac0 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
18ad0 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
18ae0 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
18af0 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
18b00 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
18b10 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
18b20 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
18b30 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
18b40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
18b50 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
18b60 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
18b70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f   }.    }.    zJo
18b80 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
18b90 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
18ba0 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20  al)+1);.  }. .  
18bb0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18bc0 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20  Master);.  rc = 
18bd0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18be0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
18bf0 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
18c00 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
18c10 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
18c20 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72  );.  if( pMaster
18c30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
18c40 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
18c50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
18c60 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
18c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18c80 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(pMaster);.  }
18c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
18cb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
18cc0 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
18cd0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
18ce0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
18cf0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
18d00 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
18d10 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
18d20 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
18d30 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
18d40 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
18d50 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
18d60 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
18d70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
18d80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
18d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18da0 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74  s not open, or t
18db0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
18dc0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d  in either.** DBM
18dd0 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65  OD or OPEN state
18de0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18df0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
18e00 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20  rwise, the size 
18e10 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20  .** of the file 
18e20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  is changed to nP
18e30 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
18e40 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
18e50 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66  e bytes). .** If
18e60 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
18e70 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  k is currently l
18e80 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65  arger than nPage
18e90 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65   pages, then use
18ea0 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75   the VFS.** xTru
18eb0 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74  ncate() method t
18ec0 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a  o truncate it..*
18ed0 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68  *.** Or, it migh
18ee0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
18ef0 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
18f00 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
18f10 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
18f20 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
18f30 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
18f40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18f50 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
18f60 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
18f70 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
18f80 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
18f90 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
18fa0 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
18fb0 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
18fc0 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
18fd0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
18fe0 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
18ff0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
19000 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
19010 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
19020 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
19030 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
19040 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
19050 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
19060 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19070 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
19080 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
19090 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
190a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
190b0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
190c0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
190d0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
190e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
190f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19100 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
19110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19120 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19130 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
19140 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
19150 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
19160 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
19170 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
19180 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
19190 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
191a0 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
191b0 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
191c0 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
191d0 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
191e0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
191f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
19200 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
19210 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
19220 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
19230 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
19240 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
19250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19260 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
19270 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
19280 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
19290 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
192a0 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
192b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
192c0 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
192d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
192e0 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
192f0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
19300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
19310 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
19320 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
19330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19340 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
19350 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
19360 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
19370 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
19380 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
19390 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
193a0 7a 50 61 67 65 29 20 3c 20 20 63 75 72 72 65 6e  zPage) <  curren
193b0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
193c0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
193d0 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
193e0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
193f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19400 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19410 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
19420 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19430 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
19440 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
19450 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
19460 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
19470 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
19480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19490 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
194a0 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
194b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
194c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
194d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
194e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
194f0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
19500 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
19510 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
19520 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
19530 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
19540 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
19550 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
19560 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
19570 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
19580 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
19590 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
195a0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
195b0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
195c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
195d0 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
195e0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
195f0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
19600 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
19610 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
19620 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
19630 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19640 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
19650 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
19660 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
19670 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
19680 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
19690 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
196a0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
196b0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
196c0 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
196d0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
196e0 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
196f0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
19700 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
19710 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
19720 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
19730 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
19740 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
19750 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
19760 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
19770 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
19780 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19790 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
197a0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
197b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
197c0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
197d0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
197e0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
197f0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
19800 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
19810 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
19820 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
19830 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
19840 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
19850 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
19860 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
19870 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19880 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
19890 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
198a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
198b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
198c0 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
198d0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
198e0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
198f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19900 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
19910 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
19920 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
19930 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
19940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19950 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
19960 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
19970 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
19980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
19990 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
199a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
199b0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
199c0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
199d0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
199e0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
199f0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
19a00 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
19a10 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
19a20 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
19a30 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
19a40 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
19a50 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
19a60 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19a70 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19a80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
19a90 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
19aa0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
19ab0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
19ac0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
19ad0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
19ae0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
19af0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
19b00 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
19b10 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
19b20 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
19b30 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19b40 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
19b50 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
19b60 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
19b70 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
19b80 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
19b90 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19ba0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19bb0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
19bc0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
19bd0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
19be0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
19bf0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
19c00 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19c10 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
19c20 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
19c30 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
19c40 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
19c50 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
19c60 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
19c70 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19c80 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
19c90 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
19ca0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
19cb0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
19cc0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
19cd0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
19ce0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
19cf0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
19d00 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19d10 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
19d20 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
19d30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19d40 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
19d50 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19d60 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
19d70 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
19d80 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
19d90 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
19da0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
19db0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
19dc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
19dd0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
19de0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
19df0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
19e00 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
19e10 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
19e20 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
19e30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
19e40 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
19e50 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
19e60 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
19e70 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
19e80 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
19e90 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
19ea0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
19eb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
19ec0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
19ed0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
19ee0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
19ef0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
19f00 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
19f10 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
19f20 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
19f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19f40 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
19f50 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
19f60 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
19f70 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
19f80 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
19f90 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
19fa0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
19fb0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
19fc0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
19fd0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
19fe0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
19ff0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1a000 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1a010 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1a020 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1a030 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1a040 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1a050 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1a060 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1a070 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1a080 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a090 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1a0a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1a0b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1a0c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1a0d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1a0e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1a0f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1a100 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1a110 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1a120 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1a130 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1a140 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1a150 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1a160 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1a170 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1a180 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1a190 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1a1a0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1a1b0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1a1c0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1a1d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1a1e0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1a1f0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1a200 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1a210 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1a220 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1a230 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1a240 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1a250 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a260 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1a270 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1a280 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1a290 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1a2a0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1a2b0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1a2c0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1a2d0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a2e0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1a2f0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1a300 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1a310 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1a320 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a330 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1a340 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1a350 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1a360 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1a370 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1a380 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1a390 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1a3a0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1a3b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1a3c0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1a3d0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1a3e0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1a3f0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1a400 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1a410 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1a420 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1a430 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1a440 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1a450 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1a460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1a470 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1a480 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1a490 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1a4a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1a4b0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1a4c0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1a4d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a4e0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a4f0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1a520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1a530 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1a540 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1a550 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a560 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1a570 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1a580 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1a590 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1a5a0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1a5b0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1a5c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1a5d0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1a5e0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1a5f0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1a620 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1a630 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a650 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1a660 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1a670 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1a680 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1a690 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1a6a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a6b0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1a6c0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1a6d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1a6e0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1a6f0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1a700 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1a710 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1a720 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1a730 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1a740 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1a750 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1a760 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1a770 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1a780 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a790 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a7a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a7b0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1a7c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1a7e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1a7f0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1a800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a810 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1a820 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1a830 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1a840 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a850 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1a860 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1a870 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1a880 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1a890 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1a8a0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1a8b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1a8c0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1a8d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1a8e0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1a8f0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1a900 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1a910 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1a920 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1a930 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1a940 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1a950 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1a960 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1a970 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1a980 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1a990 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1a9a0 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1a9b0 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1a9c0 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1a9d0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1a9e0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1a9f0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1aa00 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1aa10 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1aa20 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1aa30 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1aa40 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1aa50 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1aa60 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1aa70 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1aa80 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1aa90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1aaa0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1aab0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1aac0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1aad0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1aae0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1aaf0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1ab00 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1ab10 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1ab20 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1ab30 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1ab40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ab50 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1ab60 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1ab70 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1ab80 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1ab90 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1aba0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1abb0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1abc0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1abd0 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1abe0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1abf0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1ac00 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1ac10 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1ac20 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1ac30 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1ac40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac50 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1ac60 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1ac70 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1ac80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac90 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1aca0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1acb0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1acc0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1acd0 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1ace0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1acf0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1ad00 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1ad10 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1ad20 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1ad30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1ad40 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1ad50 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1ad60 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1ad70 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1ad80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1ad90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ada0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1adb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1adc0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1add0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ade0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1adf0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1ae00 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1ae10 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1ae20 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1ae30 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1ae40 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1ae50 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1ae60 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1ae70 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1ae80 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1ae90 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1aea0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1aeb0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1aec0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1aed0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1aee0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1aef0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1af00 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1af10 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1af20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1af30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1af40 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1af50 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1af60 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1af70 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1af80 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1af90 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1afa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1afb0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1afc0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1afd0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1afe0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1aff0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b000 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b010 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b020 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b030 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b040 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b050 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b060 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1b070 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1b080 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1b090 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1b0a0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1b0b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1b0c0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1b0d0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1b0e0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1b0f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1b100 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1b110 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1b120 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1b130 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1b140 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1b150 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1b160 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1b170 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1b180 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1b190 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1b1a0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1b1b0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b1c0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1b1d0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1b1e0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1b1f0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1b200 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1b210 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1b220 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1b230 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b240 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1b250 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1b260 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1b270 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b280 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1b290 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1b2a0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b2b0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1b2c0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1b2d0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1b2e0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b2f0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1b300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b310 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1b320 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1b330 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1b340 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1b350 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b360 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b370 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1b380 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b390 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b3a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b3b0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1b3c0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b3d0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1b3e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b3f0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1b400 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1b410 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1b420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b430 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b440 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b450 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1b460 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1b470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b490 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b4a0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1b4b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1b4c0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1b4d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1b4e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1b4f0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1b500 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1b510 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1b520 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1b530 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1b540 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1b550 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1b560 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1b570 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1b580 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b590 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b5a0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b5b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b5c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1b5d0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b5e0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1b5f0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1b600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b620 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b630 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1b640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b650 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1b660 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1b690 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1b6a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b6b0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1b6c0 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1b6d0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1b6e0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1b6f0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1b700 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1b710 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b720 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1b730 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1b740 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1b750 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1b760 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1b770 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1b780 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1b790 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1b7a0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1b7b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1b7c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1b7d0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1b7e0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1b7f0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1b800 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1b810 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b820 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1b830 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b840 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1b850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1b860 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1b870 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1b880 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1b890 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1b8a0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1b8b0 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1b8c0 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1b8d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1b8e0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1b8f0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1b900 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1b910 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1b920 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1b930 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1b940 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1b950 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1b960 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1b970 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b980 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1b990 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1b9a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b9b0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1b9c0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1b9d0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1b9e0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1b9f0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1ba00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ba10 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1ba20 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1ba30 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1ba40 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1ba50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1ba60 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1ba70 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1ba80 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1ba90 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1baa0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1bab0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1bac0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1bad0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1bae0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1baf0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
1bb00 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1bb10 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
1bb20 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1bb30 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
1bb40 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1bb50 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
1bb60 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
1bb70 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1bb80 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1bb90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1bba0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1bbb0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1bbc0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1bbd0 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1bbe0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1bbf0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1bc00 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1bc10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1bc20 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1bc30 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1bc40 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1bc50 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1bc60 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1bc70 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1bc80 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1bc90 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1bca0 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1bcb0 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1bcc0 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1bcd0 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1bce0 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1bcf0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1bd00 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1bd10 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1bd20 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1bd30 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1bd40 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1bd50 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1bd60 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1bd70 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1bd80 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1bd90 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1bda0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1bdb0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1bdc0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1bdd0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1bde0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1bdf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1be00 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1be10 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1be20 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1be30 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1be40 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1be50 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1be60 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1be70 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1be80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1be90 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1bea0 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1beb0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1bec0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1bed0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1bee0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1bef0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1bf00 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1bf10 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1bf20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf30 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1bf40 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1bf50 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1bf60 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
1bf70 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1bf80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1bf90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bfa0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1bfb0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1bfc0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1bfd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bfe0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1bff0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1c000 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1c010 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1c020 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1c030 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1c040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1c050 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1c060 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1c070 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1c0a0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1c0b0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1c0c0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1c0d0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1c0e0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1c0f0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1c100 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1c110 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1c120 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1c130 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1c140 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1c150 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1c160 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1c170 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1c180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c190 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1c1a0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1c1b0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c1c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c1d0 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1c1e0 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1c1f0 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1c200 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1c210 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1c220 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1c230 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c240 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1c250 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1c260 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1c270 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1c280 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1c290 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1c2a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c2b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1c2c0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1c2d0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c2e0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1c2f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1c300 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1c310 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c330 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1c340 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
1c350 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c360 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
1c370 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
1c380 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
1c390 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
1c3a0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
1c3b0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1c3c0 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
1c3d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c3e0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1c3f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c400 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30   int isInWal = 0
1c410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c420 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
1c430 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
1c440 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1c450 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1c460 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c470 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1c480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c490 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1c4a0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1c4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1c4c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1c4d0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
1c4e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c4f0 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
1c500 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1c510 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
1c520 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1c530 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c540 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1c550 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c560 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1c570 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c580 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1c590 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1c5a0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1c5b0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1c5c0 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61  lite3WalRead(pPa
1c5d0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
1c5e0 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c   &isInWal, pgsz,
1c5f0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1c600 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c610 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61  TE_OK && !isInWa
1c620 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  l ){.    i64 iOf
1c630 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1c640 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1c650 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1c660 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1c670 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1c680 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1c690 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1c6a0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c6b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c6c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c6d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1c6e0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1c6f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1c700 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1c710 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1c720 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1c730 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1c740 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1c750 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1c760 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1c770 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1c780 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1c790 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1c7a0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1c7b0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1c7c0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1c7d0 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1c7e0 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1c7f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c800 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1c810 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1c820 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1c830 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1c840 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1c850 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1c860 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1c870 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1c880 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1c890 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1c8a0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1c8b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1c8c0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1c8d0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1c8e0 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1c8f0 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1c900 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1c910 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c920 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1c930 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1c940 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1c950 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
1c960 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1c970 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1c980 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1c990 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1c9a0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1c9b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c9c0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1c9d0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1c9e0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1c9f0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1ca00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca10 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1ca20 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1ca30 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1ca40 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1ca50 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1ca60 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1ca70 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ca80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1ca90 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1caa0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1cab0 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1cac0 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1cad0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1cae0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1caf0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1cb00 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1cb10 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1cb20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cb30 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1cb40 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1cb50 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1cb60 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1cb70 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cb80 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1cb90 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cba0 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1cbb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1cbc0 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1cbd0 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1cbe0 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1cbf0 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1cc00 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1cc10 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1cc20 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1cc30 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1cc40 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1cc50 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1cc60 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1cc70 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1cc80 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1cc90 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1cca0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1ccb0 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1ccc0 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1ccd0 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1cce0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1ccf0 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1cd00 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1cd10 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1cd20 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1cd30 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1cd40 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1cd50 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1cd60 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1cd70 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1cd80 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1cd90 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1cda0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1cdb0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1cdc0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1cdd0 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1cde0 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1cdf0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1ce00 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1ce10 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1ce20 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1ce30 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1ce40 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1ce50 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1ce60 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1ce70 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1ce80 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1ce90 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1cea0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1ceb0 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1cec0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1ced0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1cee0 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1cef0 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1cf00 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1cf10 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1cf20 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1cf30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1cf40 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1cf50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cf60 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1cf70 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1cf80 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1cf90 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1cfa0 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1cfb0 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1cfc0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1cfd0 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1cfe0 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1cff0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d000 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1d010 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1d020 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1d030 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1d040 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1d050 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1d060 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1d070 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1d080 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1d090 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1d0a0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1d0b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1d0c0 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1d0d0 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1d0e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1d0f0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1d100 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1d110 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1d120 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1d130 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1d140 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1d150 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1d160 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1d170 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1d180 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1d190 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1d1a0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1d1b0 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1d1c0 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1d1d0 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1d1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d1f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d200 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1d210 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1d220 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1d230 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1d240 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1d250 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1d260 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1d270 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1d280 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d290 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1d2a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d2b0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1d2c0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
1d2d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1d2f0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1d300 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1d320 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
1d330 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1d340 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1d350 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d360 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1d370 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1d380 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1d390 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1d3a0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1d3b0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1d3c0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1d3d0 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1d3e0 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1d3f0 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1d400 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1d410 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1d420 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1d430 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1d440 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1d450 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1d460 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1d470 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d480 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1d490 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1d4a0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1d4b0 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1d4c0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1d4d0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1d4e0 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1d4f0 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1d500 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1d510 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1d520 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1d530 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1d540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d560 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1d570 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1d580 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1d590 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1d5a0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1d5b0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1d5c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d5f0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1d600 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1d610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1d620 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1d630 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1d640 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1d650 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1d660 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1d670 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1d680 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1d690 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1d6a0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1d6b0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1d6c0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1d6d0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1d6e0 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1d6f0 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1d700 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1d710 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1d720 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1d730 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d740 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1d750 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1d760 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d770 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1d780 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1d790 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1d7a0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1d7b0 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1d7c0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1d7d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1d7e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1d7f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1d800 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1d810 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1d820 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1d830 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1d840 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1d850 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1d860 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1d870 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1d880 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1d890 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d8a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d8b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1d8c0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1d8d0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1d8e0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1d8f0 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1d900 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1d910 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1d920 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1d930 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1d940 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1d950 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1d960 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1d970 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1d980 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1d990 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1d9a0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1d9b0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1d9c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1d9d0 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1d9e0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1d9f0 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1da00 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1da10 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1da20 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1da30 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1da40 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1da50 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1da60 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1da70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1da80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1da90 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dab0 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1dac0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1dad0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1dae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1daf0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1db00 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1db10 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1db40 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1db50 2f 0a 20 20 69 6e 74 20 73 79 6e 63 46 6c 61 67  /.  int syncFlag
1db60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1db70 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1db80 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1db90 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1dba0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1dbd0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1dbe0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1dbf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1dc00 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1dc10 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc30 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1dc40 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1dc50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1dc60 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1dc70 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1dc80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1dc90 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1dca0 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1dcb0 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1dcc0 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1dcd0 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1dce0 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1dcf0 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1dd00 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1dd10 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1dd20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1dd30 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1dd40 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1dd50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1dd60 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1dd70 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1dd80 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1dd90 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1dda0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1ddb0 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1ddc0 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1ddd0 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1dde0 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1ddf0 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1de00 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1de10 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1de20 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1de30 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1de40 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48  gHdr *p;.    PgH
1de50 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1de60 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d  List;.    for(p=
1de70 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1de80 3d 20 70 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74  = p); p=p->pDirt
1de90 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1dea0 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1deb0 20 29 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e   ) ppNext = &p->
1dec0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1ded0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1dee0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  );.  }..  if( pL
1def0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1df00 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1df10 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1df20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1df30 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1df40 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1df50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1df60 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1df70 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63  , isCommit, sync
1df80 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28  Flags.  );.  if(
1df90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dfa0 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  & pPager->pBacku
1dfb0 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  p ){.    PgHdr *
1dfc0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
1dfd0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1dfe0 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ty){.      sqlit
1dff0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
1e000 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
1e010 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70  p->pgno, (u8 *)p
1e020 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->pData);.    }.
1e030 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1e040 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1e050 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e060 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1e070 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1e080 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
1e090 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1e0a0 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  {.    pager_set_
1e0b0 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d  pagehash(p);.  }
1e0c0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1e0d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
1e0e0 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
1e0f0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
1e100 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
1e110 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
1e120 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
1e130 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
1e140 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
1e150 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
1e160 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
1e170 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
1e180 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
1e190 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
1e1a0 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
1e1b0 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
1e1c0 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
1e1d0 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
1e1e0 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
1e1f0 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
1e200 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
1e210 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1e220 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
1e230 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
1e240 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e250 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e270 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e280 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
1e290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e2a0 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
1e2b0 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
1e2c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
1e2d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e2e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e2f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1e300 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
1e310 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e320 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20  ER_READER );..  
1e330 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  /* sqlite3WalEnd
1e340 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1e350 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
1e360 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
1e370 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  s.  ** transacti
1e380 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  on in locking_mo
1e390 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53  de=EXCLUSIVE.  S
1e3a0 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20  o call it now.  
1e3b0 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69  If we.  ** are i
1e3c0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e  n locking_mode=N
1e3d0 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61  ORMAL and EndRea
1e3e0 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73  d() was previous
1e3f0 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20  ly called,.  ** 
1e400 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61  the duplicate ca
1e410 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a  ll is harmless..
1e420 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61    */.  sqlite3Wa
1e430 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1e440 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1e450 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1e460 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72  e3WalBeginReadTr
1e470 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1e480 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64  ->pWal, &changed
1e490 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1e4a0 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65  ITE_OK || change
1e4b0 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72  d ){.    pager_r
1e4c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1e4d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e4e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e4f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e500 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1e510 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1e520 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1e530 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1e540 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1e550 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1e560 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e570 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1e580 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1e590 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1e5a0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1e5b0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1e5c0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1e5d0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1e5e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1e5f0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1e600 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1e610 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1e620 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1e630 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1e640 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1e650 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1e660 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1e670 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1e680 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1e690 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e6a0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1e6b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1e6c0 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1e6d0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1e700 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1e710 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1e720 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1e730 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1e740 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1e750 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1e760 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1e770 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1e780 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1e790 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1e7a0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1e7b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1e7c0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1e7d0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e7e0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1e7f0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1e800 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1e810 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1e820 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1e830 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1e840 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1e850 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1e860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e870 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1e880 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1e890 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1e8a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1e8b0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
1e8c0 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73  k );.  nPage = s
1e8d0 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28  qlite3WalDbsize(
1e8e0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1e8f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1e900 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f  base size was no
1e910 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1e920 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1e930 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d  tem,.  ** determ
1e940 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20  ine it based on 
1e950 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1e970 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20  f the size.  ** 
1e980 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e990 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69  file is not an i
1e9a0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
1e9b0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
1e9c0 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77  ,.  ** round dow
1e9d0 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74  n to the nearest
1e9e0 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61   page. Except, a
1e9f0 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74  ny file larger t
1ea00 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73  han 0.  ** bytes
1ea10 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
1ea20 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69  idered to contai
1ea30 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  n at least one p
1ea40 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1ea50 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1ea60 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea80 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
1ea90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1eaa0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1eab0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1eac0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ead0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
1eae0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1eaf0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1eb00 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1eb10 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
1eb20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1eb30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eb40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1eb50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1eb60 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
1eb70 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
1eb80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
1eb90 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30   nPage==0 && n>0
1eba0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1ebb0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1ebc0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1ebd0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1ebe0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1ebf0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ec00 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
1ec10 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1ec20 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1ec30 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1ec40 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1ec50 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1ec60 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1ec70 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1ec80 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1ec90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1eca0 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1ecb0 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
1ecc0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1ecd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1ece0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ecf0 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
1ed00 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1ed10 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
1ed20 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
1ed30 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
1ed40 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
1ed50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ed60 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
1ed70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
1ed80 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
1ed90 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
1eda0 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
1edb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1edc0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
1edd0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1ede0 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
1edf0 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
1ee00 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
1ee10 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
1ee20 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
1ee30 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1ee40 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
1ee50 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1ee60 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
1ee70 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
1ee80 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
1ee90 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
1eea0 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
1eeb0 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
1eec0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1eed0 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
1eee0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
1eef0 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
1ef00 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
1ef10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ef20 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
1ef30 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
1ef40 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
1ef50 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
1ef60 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
1ef70 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
1ef80 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
1ef90 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1efa0 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
1efb0 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
1efc0 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
1efd0 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
1efe0 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
1eff0 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
1f000 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
1f010 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
1f020 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1f030 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
1f040 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
1f050 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f080 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f090 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f0a0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f0b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
1f0c0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1f0d0 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  ck );..  if( !pP
1f0e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1f0f0 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
1f120 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
1f130 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
1f140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f150 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1f160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f170 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
1f180 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1f190 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1f1a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f1b0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
1f1c0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1f1d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1f1e0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
1f1f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
1f200 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c   0);.      isWal
1f210 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1f220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f230 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
1f240 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1f250 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
1f260 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1f270 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a  _EXISTS, &isWal.
1f280 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1f290 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f2a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1f2b0 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
1f2c0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
1f2d0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
1f2e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
1f2f0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  che)==0 );.     
1f300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f310 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
1f320 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  er, 0);.      }e
1f330 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1f340 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
1f350 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1f360 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AL ){.        pP
1f370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1f380 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
1f390 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20  LMODE_DELETE;.  
1f3a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f3c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  endif../*.** Pla
1f3d0 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
1f3e0 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
1f3f0 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
1f400 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
1f410 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
1f420 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f430 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
1f440 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
1f450 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
1f460 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
1f470 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
1f480 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
1f490 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
1f4a0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
1f4b0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
1f4c0 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
1f4d0 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
1f4e0 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
1f4f0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
1f500 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
1f510 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
1f520 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
1f530 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
1f540 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
1f550 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
1f560 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
1f570 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1f580 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
1f590 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
1f5a0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
1f5b0 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
1f5c0 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
1f5d0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
1f5e0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
1f5f0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
1f600 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
1f610 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
1f620 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f630 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
1f640 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f650 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
1f660 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
1f670 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f680 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
1f690 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
1f6a0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
1f6b0 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
1f6c0 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
1f6d0 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
1f6e0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1f6f0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1f700 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1f710 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
1f720 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f730 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
1f740 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
1f750 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
1f760 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1f770 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
1f780 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
1f790 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f7a0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
1f7b0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
1f7c0 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
1f7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
1f7e0 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
1f7f0 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
1f800 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
1f810 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
1f820 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
1f830 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
1f840 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
1f850 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
1f860 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
1f870 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1f880 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
1f890 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
1f8a0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
1f8b0 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
1f8c0 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
1f8d0 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
1f8e0 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
1f8f0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1f900 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
1f910 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
1f920 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
1f930 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1f940 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
1f950 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
1f960 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
1f970 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
1f980 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
1f990 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
1f9a0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
1f9b0 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
1f9c0 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
1f9d0 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
1f9e0 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
1f9f0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
1fa00 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
1fa10 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
1fa20 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
1fa30 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
1fa40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1fa50 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
1fa60 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
1fa70 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
1fa80 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
1fa90 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
1faa0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
1fab0 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
1fac0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
1fad0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
1fae0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
1faf0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1fb00 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
1fb10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
1fb20 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
1fb30 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
1fb40 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
1fb50 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
1fb60 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
1fb70 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
1fb80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fb90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1fba0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
1fbb0 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
1fbc0 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
1fbd0 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
1fbe0 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
1fbf0 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
1fc00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1fc10 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
1fc20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fc30 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1fc40 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
1fc50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1fc60 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
1fc70 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
1fc80 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
1fc90 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
1fca0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
1fcb0 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
1fcc0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
1fcd0 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
1fce0 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
1fcf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fd00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1fd10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
1fd20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
1fd30 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
1fd40 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
1fd50 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
1fd60 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
1fd70 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
1fd80 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
1fd90 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
1fda0 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
1fdb0 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
1fdc0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1fdd0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1fde0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1fdf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1fe00 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
1fe10 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
1fe20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1fe30 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
1fe40 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
1fe50 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
1fe60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fe70 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
1fe80 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
1fe90 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
1fea0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
1feb0 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
1fec0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
1fed0 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
1fee0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
1fef0 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
1ff00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
1ff10 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
1ff20 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
1ff30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ff40 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
1ff50 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
1ff60 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
1ff70 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
1ff80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1ff90 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
1ffa0 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
1ffb0 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
1ffc0 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1ffd0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
1ffe0 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
1fff0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20000 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
20010 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
20020 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
20030 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
20040 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
20050 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20060 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
20070 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
20080 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
20090 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
200a0 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
200b0 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
200c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
200d0 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
200e0 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
200f0 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
20100 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
20110 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
20120 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20130 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
20140 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20150 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
20160 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20170 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
20180 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
20190 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
201a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
201b0 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
201c0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
201d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
201e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
201f0 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
20200 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20210 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20220 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
20230 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
20240 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
20250 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
20260 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
20270 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
20280 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20290 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
202a0 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
202b0 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
202c0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
202d0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
202e0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
202f0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
20300 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
20310 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
20320 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
20330 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20340 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
20350 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
20360 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
20370 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
20380 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
20390 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
203a0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
203b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
203c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
203d0 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
203e0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
203f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20400 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
20410 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
20420 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
20430 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
20440 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
20450 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
20460 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
20470 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
20480 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20490 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
204a0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
204b0 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
204c0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
204d0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
204e0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
204f0 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
20500 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
20510 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
20520 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
20530 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
20540 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
20550 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
20560 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
20570 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
20580 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
20590 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
205a0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
205b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
205c0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
205d0 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
205e0 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
205f0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
20600 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
20610 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
20620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
20630 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
20640 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
20650 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
20660 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
20670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20680 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20690 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
206a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
206b0 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
206c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
206d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
206e0 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
206f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
20700 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
20710 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
20720 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
20730 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
20740 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
20750 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
20760 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
20770 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
20780 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
20790 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
207a0 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
207b0 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
207c0 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
207d0 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
207e0 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
207f0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
20800 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
20810 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
20820 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
20830 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
20840 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e  = (i64)pSavepoin
20850 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
20860 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
20870 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
20880 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
20890 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
208a0 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
208b0 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
208c0 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
208d0 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
208e0 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
208f0 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
20900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20910 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
20920 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
20930 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
20940 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67  =(i64)ii*(4+pPag
20950 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
20960 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
20970 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
20980 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
20990 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
209a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
209b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
209c0 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
209d0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
209e0 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
209f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20a00 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
20a10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
20a20 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20a30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
20a40 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
20a50 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
20a60 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
20a70 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
20a80 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
20a90 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
20aa0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
20ab0 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
20ac0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
20ad0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
20ae0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
20af0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
20b00 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
20b10 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
20b20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
20b30 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
20b40 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
20b50 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
20b60 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
20b70 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
20b80 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
20b90 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
20ba0 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
20bb0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
20bc0 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
20bd0 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
20be0 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
20bf0 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
20c00 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
20c10 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20c20 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
20c30 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
20c40 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
20c50 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
20c60 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
20c70 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
20c80 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
20c90 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
20ca0 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
20cb0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
20cc0 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
20cd0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
20ce0 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
20cf0 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
20d00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20d10 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
20d20 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
20d30 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
20d40 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
20d50 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
20d60 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
20d70 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
20d80 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
20d90 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
20da0 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
20db0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
20dc0 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
20dd0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
20de0 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
20df0 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
20e00 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
20e10 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
20e20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
20e30 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
20e40 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
20e50 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
20e60 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
20e70 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
20e80 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
20e90 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
20ea0 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
20eb0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
20ec0 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
20ed0 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
20ee0 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
20ef0 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
20f00 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
20f10 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
20f30 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
20f40 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
20f50 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
20f60 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
20f70 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
20f80 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
20f90 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
20fa0 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
20fb0 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
20fc0 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
20fd0 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
20fe0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20ff0 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
21000 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
21010 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
21020 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
21030 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72  The above is for
21040 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72   a rollback-jour
21050 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57  nal mode.  For W
21060 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e  AL mode, OFF con
21070 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61  tinues.** to mea
21080 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20  n that no syncs 
21090 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52  ever occur.  NOR
210a0 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  MAL means that t
210b0 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64  he WAL is synced
210c0 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65  .** prior to the
210d0 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70   start of checkp
210e0 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68  oint and that th
210f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21100 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20  is synced.** at 
21110 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
21120 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
21130 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63   if the entire c
21140 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41  ontent of the WA
21150 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e  L.** was written
21160 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
21170 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f  atabase.  But no
21180 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73   sync operations
21190 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e   occur for.** an
211a0 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74   ordinary commit
211b0 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20   in NORMAL mode 
211c0 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20  with WAL.  FULL 
211d0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
211e0 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79  AL.** file is sy
211f0 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  nced following e
21200 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61  ach commit opera
21210 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f  tion, in additio
21220 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63  n to the.** sync
21230 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21240 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20  h NORMAL..**.** 
21250 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73  Do not confuse s
21260 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
21270 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43  with SQLITE_SYNC
21280 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53  _FULL.  The.** S
21290 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
212a0 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75  macro means to u
212b0 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74  se the MacOSX-st
212c0 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a  yle full-fsync.*
212d0 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f  * using fcntl(F_
212e0 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c  FULLFSYNC).  SQL
212f0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
21300 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a  means to do an.*
21310 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63  * ordinary fsync
21320 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20  () call.  There 
21330 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
21340 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
21350 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64  SYNC_FULL.** and
21360 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21370 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  MAL on platforms
21380 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f   other than MacO
21390 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20  SX.  But the.** 
213a0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
213b0 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e   versus synchron
213c0 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69  ous=NORMAL setti
213d0 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ng determines wh
213e0 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20  en.** the xSync 
213f0 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c  primitive is cal
21400 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76  led and is relev
21410 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66  ant to all platf
21420 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  orms..**.** Nume
21430 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
21440 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
21450 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
21460 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
21470 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
21480 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21490 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
214a0 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
214b0 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
214c0 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  l(.  Pager *pPag
214d0 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
214e0 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
214f0 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
21500 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20  */.  int level, 
21510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52             /* PR
21520 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
21530 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d  .  1=OFF, 2=NORM
21540 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a  AL, 3=FULL */  .
21550 20 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63    int bFullFsync
21560 2c 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d  ,       /* PRAGM
21570 41 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20  A fullfsync */. 
21580 20 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c 46 73   int bCkptFullFs
21590 79 6e 63 20 20 20 20 2f 2a 20 50 52 41 47 4d 41  ync    /* PRAGMA
215a0 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
215b0 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73  fsync */.){.  as
215c0 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26  sert( level>=1 &
215d0 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20  & level<=3 );.  
215e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
215f0 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
21600 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
21610 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
21620 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
21630 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
21640 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
21650 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21660 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
21670 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
21680 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
21690 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
216a0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
216b0 62 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20  bFullFsync ){.  
216c0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
216d0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
216e0 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67  C_FULL;.    pPag
216f0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
21700 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21710 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  FULL;.  }else if
21720 28 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63  ( bCkptFullFsync
21730 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21740 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
21750 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
21760 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
21770 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
21780 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
21790 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
217a0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
217b0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
217c0 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
217d0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
217e0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
217f0 4c 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  L;.  }.}.#endif.
21800 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
21810 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
21820 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
21830 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
21840 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
21850 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
21860 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
21870 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
21880 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
21890 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
218a0 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
218b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
218c0 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
218d0 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
218e0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
218f0 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
21900 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
21910 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
21920 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
21930 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
21940 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
21950 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
21960 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
21970 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
21980 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
21990 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
219a0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
219b0 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
219c0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
219d0 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
219e0 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
219f0 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
21a00 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
21a10 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
21a20 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
21a30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
21a40 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
21a50 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
21a60 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
21a70 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
21a80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
21a90 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
21aa0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
21ab0 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
21ac0 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
21ad0 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
21ae0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
21af0 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
21b00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
21b10 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
21b20 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
21b30 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
21b40 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
21b50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
21b60 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
21b70 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
21b80 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
21b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
21ba0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
21bb0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
21bc0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
21bd0 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
21be0 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
21bf0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
21c00 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
21c10 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
21c20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
21c30 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
21c40 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
21c50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
21c60 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
21c70 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
21c80 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
21c90 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
21ca0 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
21cb0 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
21cc0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
21cd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
21ce0 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
21cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21d00 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
21d10 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
21d20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
21d30 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
21d40 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
21d50 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
21d60 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
21d70 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
21d80 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
21d90 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
21da0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
21db0 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
21dc0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
21dd0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
21de0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
21df0 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
21e00 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
21e10 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
21e20 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
21e30 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
21e40 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
21e50 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
21e60 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
21e70 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
21e80 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
21e90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
21ea0 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
21eb0 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
21ec0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
21ed0 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
21ee0 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
21ef0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
21f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
21f30 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
21f40 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
21f50 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
21f60 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
21f70 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
21f80 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
21f90 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
21fa0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
21fb0 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
21fc0 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
21fd0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
21fe0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
21ff0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
22000 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
22010 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
22020 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
22030 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
22040 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
22050 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
22060 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
22070 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
22080 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
22090 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
220a0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
220b0 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
220c0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
220f0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
22100 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
22110 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
22120 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
22130 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
22140 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
22150 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
22160 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
22170 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
22180 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
22190 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  {  .  pPager->xB
221a0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
221b0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
221c0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
221d0 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
221e0 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lerArg;.}../*.**
221f0 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
22200 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
22210 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
22220 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
22230 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
22240 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
22250 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
22260 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
22270 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
22280 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22290 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
222a0 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
222b0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
222c0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
222d0 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
222e0 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
222f0 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
22300 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
22310 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
22320 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
22330 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
22340 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
22350 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
22360 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
22370 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
22380 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
22390 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
223a0 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
223b0 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
223c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
223d0 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
223e0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
223f0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
22400 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
22410 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
22420 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
22430 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
22440 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
22450 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
22460 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
22470 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
22480 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
22490 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
224a0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
224b0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
224c0 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
224d0 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
224e0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
224f0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
22500 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
22510 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
22520 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
22530 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
22540 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
22550 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
22560 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
22570 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
22580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
22590 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
225a0 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
225b0 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
225c0 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
225d0 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
225e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
225f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
22600 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
22610 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
22620 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
22630 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
22640 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
22650 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
22660 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
22670 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
22680 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
22690 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
226a0 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
226b0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
226c0 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
226d0 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
226e0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
226f0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
22700 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
22710 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
22720 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
22730 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
22740 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
22750 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
22760 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
22770 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
22780 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
22790 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
227a0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
227b0 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
227c0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
227d0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
227e0 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
227f0 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
22800 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
22810 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
22820 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
22830 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
22840 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
22850 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
22860 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
22870 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
22880 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
22890 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
228a0 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
228b0 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
228c0 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
228d0 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
228e0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
228f0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
22900 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
22910 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
22920 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
22930 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
22940 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
22950 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
22960 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
22970 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
22980 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
22990 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
229a0 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
229b0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
229c0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
229d0 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
229e0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
229f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22a00 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
22a10 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
22a20 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
22a30 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
22a40 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
22a50 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
22a60 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
22a70 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
22a80 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
22a90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
22aa0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
22ab0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
22ac0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
22ad0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
22ae0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
22af0 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
22b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
22b20 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
22b30 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
22b40 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
22b50 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
22b60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22b70 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
22b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b90 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
22ba0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50  Pager);.      pP
22bb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
22bc0 50 67 6e 6f 29 28 6e 42 79 74 65 2f 70 61 67 65  Pgno)(nByte/page
22bd0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
22be0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
22bf0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
22c00 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
22c10 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
22c20 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
22c30 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
22c40 65 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ew;.      sqlite
22c50 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
22c60 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
22c70 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
22c80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
22c90 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
22ca0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
22cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22cc0 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
22cd0 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
22ce0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
22cf0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
22d00 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
22d10 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
22d20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
22d30 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
22d40 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
22d50 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
22d60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
22d80 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22d90 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
22da0 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
22db0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
22dc0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
22dd0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
22de0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
22df0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
22e00 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
22e10 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
22e20 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
22e30 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
22e40 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
22e50 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
22e60 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
22e70 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
22e80 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
22e90 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
22ea0 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
22eb0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
22ec0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
22ed0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
22ee0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
22ef0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
22f00 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
22f10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
22f20 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
22f30 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
22f40 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
22f50 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
22f60 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
22f70 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
22f80 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
22f90 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
22fa0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
22fb0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
22fc0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
22fd0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
22fe0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
22ff0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
23000 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
23010 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
23020 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
23030 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
23040 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
23050 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
23060 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
23070 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
23080 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
23090 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
230a0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
230b0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
230c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
230d0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20  =PAGER_OPEN );  
230e0 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e      /* Called on
230f0 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e  ly by OP_MaxPgcn
23100 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
23110 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70  Pager->mxPgno>=p
23120 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
23130 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74    /* OP_MaxPgcnt
23140 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a   enforces this *
23150 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  /.  return pPage
23160 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
23170 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
23180 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
23190 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
231a0 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
231b0 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
231c0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
231d0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
231e0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
231f0 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
23200 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
23210 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
23220 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
23230 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
23240 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
23250 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
23260 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
23270 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
23280 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
23290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
232a0 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
232b0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
232c0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
232d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
232e0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
232f0 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
23300 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
23310 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
23320 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
23330 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
23340 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
23350 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
23360 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
23370 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
23380 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23390 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
233a0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
233b0 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
233c0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
233d0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
233e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
233f0 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
23400 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23410 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
23420 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
23430 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
23440 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
23450 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
23460 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
23470 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
23480 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23490 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
234a0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
234b0 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
234c0 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
234d0 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
234e0 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
234f0 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
23500 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
23510 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
23520 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
23530 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
23540 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
23550 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
23560 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
23570 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
23580 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
23590 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
235a0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
235b0 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
235c0 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
235d0 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
235e0 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
235f0 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
23600 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
23610 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
23620 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
23630 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
23640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
23650 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
23660 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
23670 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
23680 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
23690 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
236a0 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
236b0 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
236c0 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
236d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
236e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
236f0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
23700 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
23710 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
23720 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
23730 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
23740 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
23750 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
23760 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
23770 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
23780 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
23790 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
237a0 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
237b0 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
237c0 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
237d0 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
237e0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
237f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
23800 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
23810 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
23820 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
23830 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
23840 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
23850 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
23860 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
23870 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
23880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
23890 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
238a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
238b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
238c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
238d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
238e0 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
238f0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65  called when a re
23900 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
23910 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  s open on.** the
23920 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72   pager. It retur
23930 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
23940 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
23950 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
23960 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
23970 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
23980 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
23990 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
239a0 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
239b0 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
239c0 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
239d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
239e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
239f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
23a00 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73   *pnPage){.  ass
23a10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
23a20 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
23a30 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
23a40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
23a50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
23a60 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67  SHED );.  *pnPag
23a70 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d  e = (int)pPager-
23a80 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  >dbSize;.}.../*.
23a90 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
23aa0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
23ab0 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
23ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
23ad0 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
23ae0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
23af0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
23b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23b10 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
23b20 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
23b30 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
23b40 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
23b50 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
23b60 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
23b70 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
23b80 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
23b90 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
23ba0 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
23bb0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
23bc0 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
23bd0 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
23be0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
23bf0 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
23c00 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
23c10 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
23c20 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
23c30 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
23c40 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
23c50 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
23c60 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
23c70 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
23c80 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
23c90 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
23ca0 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
23cb0 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
23cc0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
23cd0 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
23ce0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
23cf0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
23d00 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
23d10 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
23d20 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d50 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
23d60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
23d70 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
23d80 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
23d90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
23da0 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
23db0 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
23dc0 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
23dd0 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
23de0 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
23df0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
23e00 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
23e10 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
23e20 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
23e30 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
23e40 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
23e50 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
23e60 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
23e70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
23e80 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
23e90 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
23ea0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
23eb0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
23ec0 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
23ed0 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
23ee0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
23ef0 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
23f00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
23f10 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
23f20 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
23f30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
23f40 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
23f50 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
23f60 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
23f70 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
23f80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
23f90 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
23fa0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
23fb0 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
23fc0 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
23fd0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
23fe0 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
23ff0 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
24000 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
24010 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
24020 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
24030 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
24040 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
24050 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
24060 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
24070 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
24080 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
24090 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
240a0 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
240b0 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
240c0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
240d0 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
240e0 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
240f0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
24100 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
24110 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
24120 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
24130 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
24140 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
24150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
24160 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
24170 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
24180 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
24190 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
241a0 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
241b0 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
241c0 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
241d0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
241e0 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
241f0 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
24200 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
24210 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
24220 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
24230 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
24240 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
24250 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
24260 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
24270 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
24280 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
24290 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  iour would be to
242a0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
242b0 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
242c0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
242d0 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
242e0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
242f0 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
24300 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
24310 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
24320 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
24330 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
24340 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
24350 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
24360 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
24370 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
24380 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
24390 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
243a0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
243b0 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
243c0 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
243d0 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
243e0 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
243f0 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
24400 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
24410 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
24420 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
24430 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
24440 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
24450 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
24460 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
24470 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
24480 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
24490 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
244a0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
244b0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
244c0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
244d0 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
244e0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
244f0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
24500 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24510 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
24520 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
24530 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24540 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24550 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
24560 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
24570 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
24580 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
24590 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
245a0 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
245b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
245c0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
245d0 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
245e0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
245f0 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
24600 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
24610 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
24620 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
24630 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
24640 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
24650 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
24660 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
24670 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  committed..*/.vo
24680 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
24690 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
246a0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
246b0 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
246c0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
246d0 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
246e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
246f0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
24700 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
24710 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
24720 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72  = nPage;.  asser
24730 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
24740 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  int(pPager);.}..
24750 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24760 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
24770 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
24780 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
24790 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
247a0 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
247b0 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
247c0 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
247d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
247e0 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
247f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
24800 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
24810 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
24820 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
24830 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
24840 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
24850 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
24860 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
24870 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
24880 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
24890 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
248a0 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
248b0 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
248c0 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
248d0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
248e0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
248f0 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
24900 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
24910 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
24920 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
24930 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
24940 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
24950 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
24960 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
24970 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
24980 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
24990 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
249a0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
249b0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
249c0 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
249d0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
249e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
249f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
24a00 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
24a10 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
24a20 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
24a30 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
24a40 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
24a50 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
24a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
24a70 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
24a80 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
24a90 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
24aa0 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
24ab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24ac0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
24ad0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
24ae0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
24af0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
24b00 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
24b10 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
24b20 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
24b30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24b40 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
24b50 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
24b60 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
24b70 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
24b80 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
24b90 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
24ba0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
24bb0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
24bc0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
24bd0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
24be0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
24bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
24c00 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
24c10 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
24c20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
24c30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24c40 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
24c50 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
24c60 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
24c70 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
24c80 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
24c90 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
24ca0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
24cb0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
24cc0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
24cd0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
24ce0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
24cf0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
24d00 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
24d10 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
24d20 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
24d30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24d40 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
24d50 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
24d60 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ce;..  assert( a
24d70 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
24d80 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64  e(pPager) );.  d
24d90 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
24da0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
24db0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
24dc0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a  gnMalloc();.  /*
24dd0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24de0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24df0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
24e00 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
24e10 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
24e20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
24e30 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
24e40 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
24e50 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
24e60 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
24e70 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
24e80 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
24e90 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
24ea0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
24eb0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
24ec0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
24ed0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
24ee0 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
24ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
24f00 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
24f10 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
24f20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
24f30 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
24f40 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
24f50 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
24f60 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
24f70 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
24f80 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
24f90 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
24fa0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
24fb0 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
24fc0 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
24fd0 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
24fe0 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
24ff0 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
25000 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
25010 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
25020 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
25030 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
25040 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
25050 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
25060 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
25070 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
25080 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
25090 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
250a0 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
250b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
250c0 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
250d0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
250e0 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
250f0 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
25100 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
25110 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
25120 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
25130 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
25140 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
25150 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25160 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25170 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
25180 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
25190 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
251a0 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
251b0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
251c0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
251d0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
251e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
251f0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
25200 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
25210 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25220 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
25230 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
25240 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
25250 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
25260 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
25270 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
25280 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
25290 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
252a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
252b0 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
252c0 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
252d0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
252e0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
252f0 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
25300 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
25310 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
25320 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
25330 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
25340 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
25350 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
25360 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
25370 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
25380 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
25390 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
253a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
253b0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
253c0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
253d0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
253e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
253f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
25400 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
25410 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
25420 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
25430 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
25440 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
25450 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
25460 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
25470 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
25480 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
25490 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
254a0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
254b0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
254c0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
254d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
254e0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
254f0 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
25500 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
25510 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
25520 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
25530 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
25540 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
25550 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
25560 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
25570 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
25580 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
25590 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
255a0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
255b0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
255c0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
255d0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
255e0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
255f0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
25600 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
25610 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
25620 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
25630 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
25640 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
25650 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
25660 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
25670 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
25680 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
25690 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73  f the the file-s
256a0 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
256b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
256c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
256d0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
256e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
256f0 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
25700 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
25710 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
25720 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
25730 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
25740 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
25750 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
25760 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
25770 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
25780 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
25790 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
257a0 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
257b0 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
257c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
257d0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
257e0 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
257f0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
25800 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
25810 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
25820 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
25830 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
25840 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25850 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
25860 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
25870 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
25880 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
25890 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
258a0 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
258b0 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
258c0 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
258d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
258e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
258f0 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
25900 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
25910 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
25920 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
25930 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
25940 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
25950 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
25960 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
25970 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
25980 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
25990 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
259a0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
259b0 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
259c0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
259d0 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
259e0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
259f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
25a00 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
25a10 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
25a20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
25a30 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
25a40 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
25a50 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
25a60 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
25a70 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
25a80 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
25a90 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
25aa0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
25ab0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
25ac0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
25ad0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
25ae0 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20   int newHdr){.  
25af0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b10 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25b20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
25b30 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
25b40 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
25b50 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
25b60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
25b70 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
25b80 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
25b90 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
25ba0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
25bb0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
25bc0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
25bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25be0 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
25bf0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
25c00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
25c10 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
25c20 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
25c30 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
25c40 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
25c50 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
25c60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25c70 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
25c80 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
25c90 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
25ca0 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RY ){.      cons
25cb0 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
25cc0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
25cd0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
25ce0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
25cf0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25d00 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
25d10 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
25d20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
25d30 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
25d40 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
25d50 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
25d60 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
25d70 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
25d80 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
25d90 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
25da0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
25db0 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
25dc0 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
25dd0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
25de0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
25df0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
25e00 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
25e10 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
25e20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
25e30 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
25e40 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
25e50 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
25e60 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
25e70 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
25e80 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
25e90 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
25ea0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
25eb0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
25ec0 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ous connection's
25ed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
25ee0 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
25ef0 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
25f00 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
25f10 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
25f20 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
25f30 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
25f40 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
25f50 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
25f60 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
25f70 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
25f80 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
25f90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
25fa0 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
25fb0 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
25fc0 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
25fd0 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
25fe0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
25ff0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
26000 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
26010 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
26020 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
26030 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
26040 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
26050 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
26060 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
26070 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
26080 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
26090 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
260a0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
260b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
260c0 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
260d0 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
260e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
260f0 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
26100 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
26110 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
26120 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
26130 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
26140 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
26150 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
26160 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
26170 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
26180 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
26190 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
261a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
261b0 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
261c0 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
261d0 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
261e0 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
261f0 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
26200 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
26210 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
26220 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
26230 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
26240 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
26250 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
26260 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
26270 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
26280 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
26290 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
262a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
262b0 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
262c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
262d0 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
262e0 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72        u8 zHeader
262f0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
26300 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20  Magic)+4];..    
26310 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
26320 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
26330 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
26340 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
26350 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
26360 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
26370 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
26380 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
26390 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
263a0 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
263b0 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
263c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
263d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
263e0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
263f0 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
26400 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
26410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26420 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
26430 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
26440 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
26450 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26460 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
26470 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26480 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
26490 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
264a0 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
264b0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
264c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
264d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
264e0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
264f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
26500 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
26510 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
26520 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
26530 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
26540 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
26550 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
26560 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
26570 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
26580 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
26590 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
265a0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
265b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
265c0 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
265d0 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
265e0 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
265f0 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
26600 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
26610 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
26620 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
26630 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
26640 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
26650 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
26660 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
26670 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
26680 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
26690 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
266a0 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
266b0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
266c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
266d0 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
266e0 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
266f0 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
26700 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
26710 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
26720 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
26730 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
26740 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
26750 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
26760 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
26770 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
26780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26790 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
267a0 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
267b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
267c0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
267d0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
267e0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
267f0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
26800 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
26810 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
26820 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
26830 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
26840 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
26850 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
26860 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
26870 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
26880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26890 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
268a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
268b0 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
268c0 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
268d0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
268e0 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
268f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
26900 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
26910 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
26920 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
26930 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
26940 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
26950 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
26960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26970 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
26980 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26990 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
269a0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
269b0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
269c0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
269d0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
269e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
269f0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
26a00 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
26a10 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
26a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26a30 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
26a40 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
26a50 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
26a60 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c   (pPager->syncFl
26a70 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
26a80 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
26a90 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
26aa0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
26ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26ac0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26ad0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
26ae0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26af0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
26b00 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  nalOff;.      if
26b10 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28  ( newHdr && 0==(
26b20 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26b30 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
26b40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
26b50 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
26b60 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
26b70 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
26b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26ba0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
26bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26bc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26bd0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
26be0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
26bf0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73    }..  /* Unless
26c00 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
26c10 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68   noSync mode, th
26c20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
26c30 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75  as just .  ** su
26c40 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
26c50 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  d. Either way, c
26c60 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
26c70 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
26c80 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73   .  ** all pages
26c90 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26ca0 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
26cb0 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
26cc0 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  ache);.  pPager-
26cd0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
26ce0 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
26cf0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
26d00 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
26d10 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r) );.  return S
26d20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26d30 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
26d40 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
26d50 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
26d60 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
26d70 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
26d80 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
26d90 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
26da0 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
26db0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
26dc0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
26dd0 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
26de0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26df0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
26e00 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
26e10 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
26e20 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
26e30 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
26e40 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
26e50 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
26e60 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
26e70 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
26e80 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
26e90 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
26ea0 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
26eb0 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
26ec0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
26ed0 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
26ee0 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
26ef0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
26f00 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
26f10 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
26f20 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
26f30 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
26f40 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
26f50 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
26f60 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
26f70 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
26f80 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
26f90 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
26fa0 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
26fb0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
26fc0 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
26fd0 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
26fe0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
26ff0 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
27000 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
27010 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
27020 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
27030 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
27040 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
27050 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
27060 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
27070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27080 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
27090 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
270a0 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
270b0 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
270c0 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
270d0 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
270e0 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
270f0 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
27100 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
27110 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
27120 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
27130 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
27140 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
27150 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
27160 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
27170 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27180 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
27190 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
271a0 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
271b0 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
271c0 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
271d0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
271e0 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
271f0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
27200 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
27210 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
27220 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
27230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27240 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
27250 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
27260 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
27270 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
27280 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
27290 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
272a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
272b0 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
272c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
272d0 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
272e0 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
272f0 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
27300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
27310 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
27320 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
27330 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a   PgHdr *pList){.
27340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27350 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
27360 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27370 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
27380 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27390 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
273a0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20  rollback pagers 
273b0 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
273c0 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
273d0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
273e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
273f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27400 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27410 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
27420 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
27430 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
27440 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
27450 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
27460 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
27470 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
27480 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
27490 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
274a0 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
274b0 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
274c0 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
274d0 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
274e0 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
274f0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
27500 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
27510 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
27520 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
27530 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
27540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
27550 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
27560 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
27570 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
27580 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
27590 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
275a0 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
275b0 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
275c0 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
275d0 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
275e0 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
275f0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
27600 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
27610 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
27620 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
27630 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
27640 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27650 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64  _OK && pPager->d
27660 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  bSize>pPager->db
27670 48 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  HintSize ){.    
27680 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
27690 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
276a0 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
276b0 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
276c0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
276d0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
276e0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
276f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
27700 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
27710 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
27720 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
27730 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
27740 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
27750 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
27760 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
27770 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
27780 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
27790 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
277a0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
277b0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
277c0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
277d0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
277e0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
277f0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
27800 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
27810 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
27820 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
27830 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
27840 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
27850 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
27860 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
27870 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
27880 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
27890 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
278a0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
278b0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
278c0 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
278d0 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
278e0 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
278f0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
27900 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
27910 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
27920 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
27930 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
27940 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
27950 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
27960 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
27970 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
27980 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
27990 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
279a0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
279b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
279e0 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
279f0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
27a00 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
27a10 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
27a20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
27a30 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
27a40 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
27a50 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
27a60 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
27a70 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
27a80 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
27a90 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
27aa0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
27ab0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
27ac0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
27ad0 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
27ae0 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
27af0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27b00 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
27b10 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
27b20 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
27b30 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
27b40 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
27b50 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
27b60 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
27b70 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
27b80 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
27b90 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
27ba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27bb0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
27bc0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
27bd0 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
27be0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
27bf0 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
27c00 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
27c10 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
27c20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
27c30 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
27c40 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
27c50 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
27c60 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
27c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27c80 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
27c90 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
27ca0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
27cb0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
27cc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
27cd0 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
27ce0 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
27cf0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
27d00 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
27d10 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
27d20 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
27d30 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
27d40 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
27d50 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
27d60 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
27d70 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
27d80 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
27da0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27db0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
27dc0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
27dd0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
27de0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
27df0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
27e00 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
27e10 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
27e20 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
27e30 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
27e40 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
27e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27e60 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
27e70 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
27e80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27e90 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
27ea0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
27eb0 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
27ec0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
27ed0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
27ee0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
27ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
27f00 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
27f10 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
27f20 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
27f30 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
27f40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
27f50 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
27f60 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27f70 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
27f80 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
27f90 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
27fa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
27fb0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
27fc0 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
27fd0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
27fe0 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
27ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
28000 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
28010 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28020 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28030 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
28040 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
28050 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
28060 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
28070 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28080 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
28090 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
280a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
280b0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
280c0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
280d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
280e0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
280f0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
28100 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f  r->sjfd, SQLITE_
28110 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
28120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28130 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28140 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
28150 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
28160 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
28170 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
28180 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73  urnal. .** It is
28190 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
281a0 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75  ponsibility to u
281b0 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  se subjRequiresP
281c0 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a  age() to check .
281d0 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65  ** that it is re
281e0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65  ally required be
281f0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
28200 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
28210 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
28220 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
28230 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
28240 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
28250 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
28260 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
28270 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
28280 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
28290 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
282a0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
282b0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
282c0 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
282d0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
282e0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
282f0 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
28300 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
28310 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
28320 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
28330 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
28340 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
28350 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
28360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
28370 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
28380 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
28390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
283a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
283b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
283c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
283d0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
283e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
283f0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
28400 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
28410 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
28420 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
28430 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
28440 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
28450 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
28460 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
28470 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
28480 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
28490 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
284a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
284b0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
284c0 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
284d0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
284e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
284f0 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
28500 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20  Journal(pPg) .  
28510 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70         || pPg->p
28520 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
28530 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20  igSize .    );. 
28540 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
28550 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
28560 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
28570 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f  ub-journal was o
28580 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  pened successful
28590 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61  ly (or was alrea
285a0 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a  dy open),.    **
285b0 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e   write the journ
285c0 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  al record into t
285d0 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  he file.  */.   
285e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
285f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  OK ){.      void
28600 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
28610 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20  Data;.      i64 
28620 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50  offset = (i64)pP
28630 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
28640 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
28650 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
28660 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20  pData2;.  .     
28670 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
28680 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
28690 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
286a0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
286b0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
286c0 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
286d0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
286e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
286f0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
28700 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
28710 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
28720 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
28730 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
28740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28750 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28760 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28770 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
28780 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
28790 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
287a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
287b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
287c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
287d0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
287e0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
287f0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
28800 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
28810 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
28820 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
28830 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
28840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28850 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28860 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
28870 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20  he pcache layer 
28880 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63  when it has reac
28890 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74  hed some.** soft
288a0 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54   memory limit. T
288b0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
288c0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
288d0 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74  o a Pager object
288e0 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76  .** (cast as a v
288f0 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72  oid*). The pager
28900 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67   is always 'purg
28910 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69  eable' (not an i
28920 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
28930 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e  base). The secon
28940 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
28950 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70  reference to a p
28960 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20  age that is .** 
28970 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
28980 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  but has no outst
28990 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
289a0 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69  s. The page.** i
289b0 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61  s always associa
289c0 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67  ted with the Pag
289d0 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
289e0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
289f0 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
28a00 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
28a10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f  s function is to
28a20 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20   make pPg clean 
28a30 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63  by writing its c
28a40 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74  ontents.** out t
28a50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28a60 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ile, if possible
28a70 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c  . This may invol
28a80 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a  ve syncing the.*
28a90 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
28aa0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
28ab0 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61  sful, sqlite3Pca
28ac0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
28ad0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
28ae0 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  page and.** SQLI
28af0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
28b00 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
28b10 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
28b20 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ng to make the.*
28b30 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68  * page clean, th
28b40 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
28b50 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
28b60 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  the page cannot 
28b70 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e  be.** made clean
28b80 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
28b90 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65  reason, but no e
28ba0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
28bb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
28bc0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  s returned by sq
28bd0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
28be0 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  lean() is not ca
28bf0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
28c00 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
28c10 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a  void *p, PgHdr *
28c20 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
28c30 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
28c40 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  )p;.  int rc = S
28c50 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
28c60 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
28c70 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
28c80 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
28c90 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
28ca0 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  /* The doNotS
28cb0 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73  yncSpill flag is
28cc0 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65   set during time
28cd0 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73  s when doing a s
28ce0 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72  ync of.  ** jour
28cf0 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20  nal (and adding 
28d00 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73  a new header) is
28d10 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54   not allowed.  T
28d20 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  his occurs.  ** 
28d30 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20  during calls to 
28d40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28d50 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67  e() while trying
28d60 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74   to journal mult
28d70 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  iple.  ** pages 
28d80 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
28d90 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20   same sector..  
28da0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f  **.  ** The doNo
28db0 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69  tSpill flag inhi
28dc0 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
28dd0 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65  pilling regardle
28de0 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20  ss of whether.  
28df0 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  ** or not a sync
28e00 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
28e10 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
28e20 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  g a rollback..  
28e30 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
28e40 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
28e50 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
28e60 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
28e70 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
28e80 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
28e90 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
28ea0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
28eb0 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20  mplementaton it 
28ec0 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
28ed0 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
28ee0 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
28ef0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
28f00 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a  reateFlag==1.  *
28f10 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
28f20 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
28f30 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
28f40 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
28f50 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
28f60 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
28f70 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
28f80 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
28f90 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
28fa0 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
28fb0 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
28fc0 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
28fd0 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
28fe0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
28ff0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
29000 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
29010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
29020 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
29030 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  l ) return SQLIT
29040 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
29050 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
29060 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  ll && (pPg->flag
29070 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
29080 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  YNC)!=0 ){.    r
29090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
290a0 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
290b0 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
290c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
290d0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
290e0 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
290f0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
29100 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
29110 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
29120 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20  resPage(pPg) ){ 
29130 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
29140 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
29150 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20   .    }.    if( 
29160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29170 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29180 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
29190 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29  r, pPg, 0, 0, 0)
291a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
291b0 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
291c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
291d0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
291e0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
291f0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29200 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  YNC .     || pPa
29210 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
29220 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
29230 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OD.    ){.      
29240 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
29250 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
29260 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
29270 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
29280 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
29290 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
292a0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
292b0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
292c0 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
292d0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
292e0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
292f0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20  journal..    ** 
29300 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
29310 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  the call to page
29320 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
29330 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f  () below will no
29340 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  t.    ** actuall
29350 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  y write data to 
29360 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73  the file in this
29370 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   case..    **.  
29380 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68    ** Consider th
29390 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75  e following sequ
293a0 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a  ence of events:.
293b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
293c0 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20  BEGIN;.    **   
293d0 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
293e0 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d  X>.    **     <m
293f0 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
29400 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
29410 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20  NT sp;.    **   
29420 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61      <shrink data
29430 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70  base file to Y p
29440 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ages>.    **    
29450 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
29460 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20  age X).    **   
29470 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70    ROLLBACK TO sp
29480 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
29490 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
294a0 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
294b0 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
294c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
294d0 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20  tten.    ** out 
294e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
294f0 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
29500 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
29510 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
29520 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
29530 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
29540 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
29550 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
29560 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a  will read.    **
29570 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
29580 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
29590 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  is will be the c
295a0 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73  opy of page X as
295b0 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77   it.    ** was w
295c0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
295d0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74  ion started, not
295e0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
295f0 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20  "SAVEPOINT sp". 
29600 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74     ** was execut
29610 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
29620 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
29630 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
29640 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
29650 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
29660 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  .    ** sub-jour
29670 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
29680 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29690 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
296a0 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a  at it will.    *
296b0 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
296c0 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
296d0 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
296e0 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
296f0 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64  .    ** executed
29700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29710 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20   NEVER(.        
29720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29730 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
29740 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
29750 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
29760 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20  g).    ) ){.    
29770 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
29780 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
29790 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
297a0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
297b0 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
297c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
297d0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
297e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
297f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
29800 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
29810 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
29820 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
29830 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
29840 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
29850 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29860 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
29870 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
29880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29890 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
298a0 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
298b0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
298c0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
298d0 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
298e0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
298f0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
29900 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
29910 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a  r(pPager, rc); .
29920 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
29930 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
29940 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
29950 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
29960 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
29970 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
29980 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
29990 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
299a0 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
299b0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
299c0 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
299d0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
299e0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
299f0 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
29a00 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
29a10 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
29a20 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
29a30 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
29a40 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
29a50 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
29a60 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
29a70 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
29a80 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
29a90 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
29aa0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
29ab0 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
29ac0 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
29ad0 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
29ae0 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
29af0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
29b00 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
29b10 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
29b20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
29b30 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
29b40 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
29b50 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
29b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
29b70 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
29b80 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
29b90 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
29ba0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
29bb0 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
29bc0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
29bd0 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
29be0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
29bf0 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
29c00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
29c10 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a  xtra() API..**.*
29c20 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
29c30 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
29c40 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
29c50 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
29c60 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
29c70 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
29c80 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
29c90 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
29ca0 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
29cb0 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f   the PAGER_OMIT_
29cc0 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45  JOURNAL and PAGE
29cd0 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c  R_NO_READLOCK fl
29ce0 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
29cf0 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  fsFlags paramete
29d00 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
29d10 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c  o pass to the fl
29d20 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  ags parameter.**
29d30 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20   of the xOpen() 
29d40 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75  method of the su
29d50 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20  pplied VFS when 
29d60 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a  opening files. .
29d70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
29d80 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  er object is all
29d90 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73  ocated and the s
29da0 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70  pecified file op
29db0 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73  ened .** success
29dc0 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b  fully, SQLITE_OK
29dd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
29de0 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f   *ppPager set to
29df0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
29e00 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63   new pager objec
29e10 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
29e20 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20  ccurs, *ppPager 
29e30 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
29e40 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65  * and error code
29e50 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
29e60 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
29e70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
29e80 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c  .** (sqlite3Mall
29e90 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  oc() is used to 
29ea0 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29  allocate memory)
29eb0 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
29ec0 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73  N or .** various
29ed0 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65   SQLITE_IO_XXX e
29ee0 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
29ef0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
29f00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
29f10 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
29f20 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
29f30 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
29f40 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
29f50 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r,         /* OU
29f60 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  T: Return the Pa
29f70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
29f80 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
29f90 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
29fa0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
29fb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29fc0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
29fd0 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
29fe0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
29ff0 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
2a000 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2a010 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a030 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
2a040 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
2a050 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c  .  int vfsFlags,
2a060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2a070 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
2a080 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
2a090 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
2a0a0 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
2a0b0 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63  DbPage*) /* Func
2a0c0 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61  tion to reinitia
2a0d0 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b  lize pages */.){
2a0e0 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
2a0f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
2a100 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72  ;       /* Pager
2a110 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63   object to alloc
2a120 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  ate and return *
2a130 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2a140 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
2a150 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2a160 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
2a170 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
2a180 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73  e for temp files
2a190 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72   (incl. in-memor
2a1a0 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e  y files) */.  in
2a1b0 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20  t memDb = 0;    
2a1c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2a1d0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
2a1e0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
2a1f0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
2a200 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
2a210 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  e if this is a r
2a220 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f  ead-only file */
2a230 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
2a240 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42  leSize;     /* B
2a250 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2a260 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2a270 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  l fd */.  char *
2a280 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  zPathname = 0;  
2a290 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20     /* Full path 
2a2a0 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
2a2b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   */.  int nPathn
2a2c0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
2a2d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2a2e0 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a  s in zPathname *
2a2f0 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
2a300 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
2a310 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
2a320 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74  )==0; /* False t
2a330 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a  o omit journal *
2a340 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  /.  int noReadlo
2a350 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
2a360 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
2a370 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  !=0;  /* True to
2a380 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20   omit read-lock 
2a390 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
2a3a0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
2a3b0 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
2a3c0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2a3d0 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
2a3e0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65   */.  u32 szPage
2a3f0 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
2a400 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2a410 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
2a420 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73  e size */.  cons
2a430 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30  t char *zUri = 0
2a440 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73  ;    /* URI args
2a450 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
2a460 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20  t nUri = 0;     
2a470 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a480 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49   of bytes of URI
2a490 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a   args at *zUri *
2a4a0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
2a4b0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
2a4c0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
2a4d0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2a4e0 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
2a4f0 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
2a500 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
2a510 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
2a520 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
2a530 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
2a540 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
2a550 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
2a560 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
2a570 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
2a580 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
2a590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2a5a0 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
2a5b0 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
2a5c0 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
2a5d0 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
2a5e0 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
2a5f0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
2a600 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
2a610 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
2a620 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
2a630 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
2a640 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2a650 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
2a660 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
2a670 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
2a680 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
2a690 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
2a6a0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2a6b0 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
2a6c0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2a6d0 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2a6e0 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
2a6f0 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
2a700 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2a710 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
2a720 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
2a730 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
2a740 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
2a750 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
2a760 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
2a770 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
2a780 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2a790 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
2a7a0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
2a7b0 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
2a7c0 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
2a7d0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2a7e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2a7f0 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
2a800 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
2a810 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
2a820 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
2a830 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
2a840 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
2a850 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
2a860 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
2a870 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
2a880 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
2a890 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
2a8a0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
2a8b0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2a8c0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2a8d0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  e[0] ){.    cons
2a8e0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e  t char *z;.    n
2a8f0 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
2a900 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2a910 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2a920 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61  qlite3Malloc(nPa
2a930 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
2a940 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2a950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a960 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a970 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2a980 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2a990 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2a9a0 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2a9b0 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2a9c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2a9d0 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2a9e0 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2a9f0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2aa00 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2aa10 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2aa20 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2aa30 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2aa40 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2aa50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2aa60 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2aa70 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2aa80 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2aa90 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2aaa0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2aab0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2aac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2aad0 20 3d 20 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 3b   = &z[1] - zUri;
2aae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2aaf0 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
2ab00 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
2ab10 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
2ab20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
2ab30 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
2ab40 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
2ab50 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2ab60 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2ab70 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
2ab80 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
2ab90 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
2aba0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
2abb0 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
2abc0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
2abd0 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
2abe0 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
2abf0 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
2ac00 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
2ac10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ac20 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
2ac30 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
2ac40 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
2ac50 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
2ac60 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2ac70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2ac80 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2ac90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2aca0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2acb0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
2acc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2acd0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2ace0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2acf0 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2ad00 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2ad10 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2ad20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2ad30 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2ad40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2ad50 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2ad60 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2ad70 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2ad80 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2ad90 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2ada0 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2adb0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2adc0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2add0 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2ade0 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2adf0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2ae00 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2ae10 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2ae20 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2ae30 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2ae40 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2ae50 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2ae60 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2ae70 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2ae80 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2ae90 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2aea0 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2aeb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2aec0 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2aed0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2aee0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2aef0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2af00 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2af10 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2af20 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2af30 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2af40 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2af50 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2af60 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2af70 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2af80 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2af90 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2afa0 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2afb0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2afc0 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2afd0 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2afe0 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2aff0 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2b000 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2b010 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2b020 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2b030 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2b040 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2b050 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2b060 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2b070 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2b080 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2b090 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b0a0 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2b0b0 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20   + 8 + 1        
2b0c0 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2b0d0 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2b0e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2b0f0 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2b100 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
2b110 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2b120 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2b130 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2b140 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2b150 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2b160 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2b170 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2b180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b190 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
2b1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b1b0 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
2b1c0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2b1d0 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
2b1e0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
2b1f0 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
2b200 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2b210 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2b220 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
2b230 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
2b240 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2b250 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
2b260 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
2b270 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
2b280 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2b290 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2b2a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
2b2b0 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
2b2c0 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
2b2d0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2b2e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b2f0 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
2b300 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2b310 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
2b320 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2b330 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
2b340 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
2b350 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
2b360 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
2b370 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
2b380 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
2b390 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
2b3a0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  hname ){.    ass
2b3b0 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30  ert( nPathname>0
2b3c0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2b3d0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2b3e0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2b3f0 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2b400 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2b410 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b420 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2b430 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2b440 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69  cpy(&pPager->zFi
2b450 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
2b460 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  +1], zUri, nUri)
2b470 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2b480 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
2b490 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2b4a0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2b4b0 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
2b4c0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2b4d0 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20  -journal", 8);. 
2b4e0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2b4f0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2b500 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2b510 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2b520 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b530 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2b540 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2b550 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2b560 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2b570 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2b580 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2b590 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2b5a0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2b5b0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2b5c0 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20 73 71  wal", 4);.    sq
2b5d0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2b5e0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2b5f0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2b600 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2b610 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
2b620 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
2b630 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
2b640 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
2b650 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
2b660 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2b670 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
2b680 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2b690 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2b6a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
2b6b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
2b6d0 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
2b6e0 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
2b6f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2b700 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2b710 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2b720 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
2b730 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61  s, &fout);.    a
2b740 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b  ssert( !memDb );
2b750 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2b760 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2b770 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
2b780 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2b790 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2b7a0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
2b7b0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
2b7c0 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
2b7d0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2b7e0 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
2b7f0 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
2b800 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2b810 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
2b820 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
2b830 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
2b840 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2b850 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
2b860 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
2b870 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
2b880 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2b890 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
2b8a0 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
2b8b0 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
2b8c0 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
2b8d0 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
2b8e0 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
2b8f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b900 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
2b910 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  ){.      setSect
2b920 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2b930 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2b940 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2b950 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2b960 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2b970 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
2b980 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2b990 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2b9a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2b9b0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
2b9c0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2b9d0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
2b9e0 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2b9f0 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
2ba00 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2ba10 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  IZE;.        }el
2ba20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
2ba30 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29  PageDflt = (u32)
2ba40 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2ba50 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
2ba60 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2ba70 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2ba80 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a  C_WRITE.      {.
2ba90 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
2baa0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
2bab0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2bac0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2bad0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
2bae0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2baf0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2bb00 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
2bb10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2bb20 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2bb30 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2bb40 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
2bb50 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
2bb60 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2bb70 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
2bb80 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2bb90 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2bba0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2bbb0 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2bbc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2bbd0 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
2bbe0 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
2bbf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2bc00 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2bc10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bc20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
2bc30 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ndif.    }.  }el
2bc40 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2bc50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2bc60 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2bc70 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2bc80 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2bc90 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2bca0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2bcb0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2bcc0 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2bcd0 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2bce0 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2bcf0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2bd00 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2bd10 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2bd20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2bd30 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2bd40 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2bd50 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2bd60 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2bd70 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2bd80 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2bd90 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2bda0 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2bdb0 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2bdc0 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2bdd0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20  urnal..    */ . 
2bde0 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2bdf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2be00 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2be10 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ER;.    pPager->
2be20 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2be30 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64  E_LOCK;.    read
2be40 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
2be50 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2be60 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
2be70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2be80 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
2be90 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
2bea0 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
2beb0 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
2bec0 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
2bed0 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
2bee0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
2bef0 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
2bf00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bf10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2bf20 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
2bf30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2bf40 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
2bf50 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
2bf60 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
2bf70 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
2bf80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
2bf90 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
2bfa0 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65  or occurred in e
2bfb0 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
2bfc0 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
2bfd0 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
2bfe0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
2bff0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
2c000 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
2c010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2c020 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
2c030 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20  TmpSpace );.    
2c040 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2c050 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2c060 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2c070 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
2c080 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
2c090 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
2c0a0 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
2c0b0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
2c0c0 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72  <1000 );.  nExtr
2c0d0 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
2c0e0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
2c0f0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2c100 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2c110 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2c120 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2c130 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2c140 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2c150 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2c160 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2c170 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
2c180 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
2c190 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
2c1a0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
2c1b0 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
2c1c0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
2c1d0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2c1e0 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
2c1f0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
2c200 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
2c210 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2c220 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
2c230 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
2c240 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
2c250 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2c260 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2c270 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2c280 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2c290 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2c2a0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2c2b0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c2c0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2c2d0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c2e0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2c2f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2c300 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2c310 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2c320 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2c330 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2c340 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
2c350 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
2c360 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
2c370 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
2c380 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
2c390 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
2c3a0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
2c3b0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2c3c0 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
2c3d0 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
2c3e0 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
2c3f0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2c400 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
2c410 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
2c420 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2c430 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
2c440 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
2c450 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2c460 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
2c470 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2c480 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2c490 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   .  pPager->chan
2c4a0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
2c4b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2c4c0 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
2c4d0 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
2c4e0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
2c4f0 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
2c500 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75    assert( useJou
2c510 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  rnal || pPager->
2c520 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50  tempFile );.  pP
2c530 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
2c540 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2c550 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
2c560 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ync = pPager->no
2c570 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61  Sync ?0:1;.  pPa
2c580 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
2c590 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2c5a0 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 53 59 4e  ? 0 : SQLITE_SYN
2c5b0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61 67  C_NORMAL;.  pPag
2c5c0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2c5d0 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  s = pPager->sync
2c5e0 46 6c 61 67 73 3b 0a 20 20 2f 2a 20 70 50 61 67  Flags;.  /* pPag
2c5f0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2c600 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2c610 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2c620 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c630 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2c640 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2c650 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2c660 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2c670 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2c680 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2c690 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2c6a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2c6b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2c6c0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2c6d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2c6e0 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2c6f0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2c700 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2c710 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2c720 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2c730 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2c740 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2c750 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2c760 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2c770 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2c780 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2c790 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2c7a0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2c7b0 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2c7c0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2c7d0 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2c7e0 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2c7f0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2c800 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2c810 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  )); */..  *ppPag
2c820 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2c830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c840 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .}..../*.** This
2c850 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c860 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2c870 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2c880 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2c890 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2c8a0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2c8b0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2c8c0 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2c8d0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2c8e0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2c8f0 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2c900 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2c910 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2c920 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2c930 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2c940 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2c950 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2c960 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2c970 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2c980 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2c990 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2c9a0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2c9b0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2c9c0 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2c9d0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2c9e0 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2c9f0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2ca00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ca10 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2ca20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2ca30 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2ca40 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2ca50 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2ca60 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2ca70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2ca80 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2ca90 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2caa0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2cab0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2cac0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2cad0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2cae0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2caf0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2cb00 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2cb10 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2cb20 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2cb30 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2cb40 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2cb50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cb60 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2cb70 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2cb80 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2cb90 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2cba0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2cbb0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2cbc0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2cbd0 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2cbe0 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2cbf0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2cc00 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2cc10 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2cc20 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2cc30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2cc40 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2cc50 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2cc60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2cc70 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2cc80 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2cc90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2cca0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2ccb0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2ccc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2ccd0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2cce0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2ccf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2cd00 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2cd10 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2cd20 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2cd30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2cd40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2cd50 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2cd60 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2cd70 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2cd80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2cd90 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2cda0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2cdb0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2cdc0 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2cdd0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2cde0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2cdf0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2ce00 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2ce10 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2ce20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2ce30 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2ce40 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2ce50 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2ce60 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2ce70 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2ce80 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2ce90 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2cea0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2ceb0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2cec0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2ced0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2cee0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2cef0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2cf00 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2cf10 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2cf20 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2cf30 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2cf40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2cf50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2cf60 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2cf70 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2cf80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2cf90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2cfa0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2cfb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2cfc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2cfd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2cfe0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2cff0 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2d000 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2d010 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2d020 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2d030 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2d040 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2d050 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2d060 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2d070 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2d080 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2d090 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2d0a0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2d0b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2d0c0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2d0d0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2d0e0 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2d0f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d100 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2d110 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2d120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d130 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2d140 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2d150 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2d160 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2d170 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2d180 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2d190 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2d1a0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2d1b0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2d1c0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2d1d0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2d1e0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2d1f0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2d200 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2d210 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2d220 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2d230 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2d240 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2d250 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2d260 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2d270 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2d280 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2d290 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2d2a0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2d2b0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2d2c0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2d2d0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2d2e0 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2d2f0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2d300 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2d310 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2d320 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2d330 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2d340 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2d350 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2d360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2d370 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2d380 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2d390 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2d3a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d3b0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2d3c0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d3e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2d3f0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2d400 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   */..      /* Ch
2d410 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eck the size of 
2d420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d430 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74  e. If it consist
2d440 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20  s of 0 pages,.  
2d450 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65      ** then dele
2d460 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2d470 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61  ile. See the hea
2d480 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  der comment abov
2d490 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  e for .      ** 
2d4a0 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65  the reasoning he
2d4b0 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  re.  Delete the 
2d4c0 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
2d4d0 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20   file under.    
2d4e0 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20    ** a RESERVED 
2d4f0 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61  lock to avoid ra
2d500 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e  ce conditions an
2d510 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61  d to avoid viola
2d520 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48  ting.      ** [H
2d530 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f  33020]..      */
2d540 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2d550 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2d560 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2d570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
2d590 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
2d5a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d5b0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2d5c0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
2d5d0 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
2d5e0 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2d5f0 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
2d600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d610 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
2d620 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2d630 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
2d640 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2d650 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2d660 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
2d670 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2d680 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
2d690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2d6a0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2d6b0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2d6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d6d0 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
2d6e0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2d6f0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2d700 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
2d710 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
2d720 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2d730 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2d740 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
2d750 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
2d760 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
2d770 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
2d780 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
2d790 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2d7a0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2d7b0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2d7c0 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
2d7d0 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
2d7e0 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
2d7f0 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
2d800 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
2d810 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
2d820 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2d830 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2d840 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
2d850 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2d860 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
2d870 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
2d880 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2d890 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2d8a0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2d8b0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2d8c0 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
2d8d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d8e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d8f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d900 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
2d910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2d920 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
2d930 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
2d940 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
2d950 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2d960 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d970 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
2d980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2d9b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d9c0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2d9d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d9e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2d9f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2da00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2da10 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
2da20 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
2da30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2da40 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2da50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2da60 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
2da70 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
2da80 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
2da90 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
2daa0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
2dab0 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
2dac0 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
2dad0 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
2dae0 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
2daf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
2db00 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
2db10 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
2db20 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
2db30 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
2db40 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
2db50 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
2db60 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
2db70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
2db80 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
2db90 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
2dba0 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
2dbb0 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
2dbc0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
2dbd0 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
2dbe0 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
2dbf0 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
2dc00 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
2dc10 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
2dc20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
2dc30 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
2dc40 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
2dc50 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
2dc60 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
2dc70 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
2dc80 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
2dc90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2dca0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2dcb0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
2dcc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2dcd0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2dce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dcf0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2dd00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2dd10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2dd20 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
2dd30 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
2dd40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2dd50 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
2dd60 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
2dd70 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
2dd80 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
2dd90 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
2dda0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
2ddb0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
2ddc0 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
2ddd0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
2dde0 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
2ddf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2de00 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2de10 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
2de20 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
2de30 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
2de40 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
2de50 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
2de60 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
2de70 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
2de80 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
2de90 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
2dea0 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
2deb0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
2dec0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2ded0 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
2dee0 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
2def0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
2df00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
2df10 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
2df20 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
2df30 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
2df40 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
2df50 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
2df60 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
2df70 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
2df80 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
2df90 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
2dfa0 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
2dfb0 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
2dfc0 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
2dfd0 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
2dfe0 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
2dff0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
2e000 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
2e010 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
2e020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e030 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
2e040 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
2e050 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
2e060 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
2e070 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
2e080 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
2e090 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
2e0a0 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
2e0b0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
2e0c0 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
2e0d0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
2e0e0 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
2e0f0 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
2e100 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
2e110 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
2e120 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
2e130 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2e140 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
2e150 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
2e160 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2e170 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
2e180 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
2e190 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
2e1a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2e1b0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2e1c0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2e1d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2e1e0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2e1f0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2e200 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
2e210 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
2e220 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2e230 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
2e240 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
2e250 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
2e260 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2e270 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
2e280 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
2e290 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
2e2a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2e2b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e2d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2e2e0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2e2f0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2e300 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
2e310 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
2e320 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
2e330 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
2e340 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
2e350 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
2e360 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
2e370 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
2e380 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
2e390 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
2e3a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
2e3b0 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
2e3c0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
2e3d0 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
2e3e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
2e3f0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2e400 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
2e410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
2e420 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2e430 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
2e440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2e450 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2e460 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2e470 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
2e480 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
2e490 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2e4a0 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
2e4b0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2e4c0 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
2e4d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2e4e0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
2e4f0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2e500 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
2e510 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
2e520 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e530 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
2e540 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
2e550 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
2e560 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
2e570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
2e580 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70  Readlock==0 || p
2e590 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
2e5a0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  );..    if( pPag
2e5b0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d  er->noReadlock==
2e5c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2e5d0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
2e5e0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
2e5f0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
2e600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e610 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2e620 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
2e630 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
2e640 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
2e650 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
2e660 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2e670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e680 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
2e690 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2e6a0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
2e6b0 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
2e6c0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
2e6d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
2e6e0 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
2e6f0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
2e700 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
2e710 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2e720 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48  Pager->eLock<=SH
2e730 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
2e740 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
2e750 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62  urnal(pPager, &b
2e760 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
2e770 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2e780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e790 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2e7a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f     }.    if( bHo
2e7b0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
2e7c0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
2e7d0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
2e7e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e7f0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
2e800 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
2e810 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
2e820 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
2e830 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
2e840 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
2e850 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
2e860 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
2e870 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
2e880 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
2e890 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
2e8a0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
2e8b0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
2e8c0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
2e8d0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
2e8e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2e8f0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
2e900 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
2e910 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
2e920 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
2e930 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
2e940 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
2e950 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
2e960 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
2e970 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2e980 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
2e990 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2e9a0 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
2e9b0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
2e9c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
2e9d0 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
2e9e0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
2e9f0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
2ea00 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
2ea10 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
2ea20 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
2ea30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2ea40 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
2ea50 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74       ** Unless t
2ea60 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c  he pager is in l
2ea70 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2ea80 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
2ea90 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a  lock is.      **
2eaa0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53   downgraded to S
2eab0 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72  HARED_LOCK befor
2eac0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2ead0 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a  returns..      *
2eae0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
2eaf0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
2eb00 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
2eb10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2eb20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eb30 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2eb40 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
2eb50 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    /* If it is no
2eb60 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61  t already open a
2eb70 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  nd the file exis
2eb80 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e  ts on disk, open
2eb90 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
2eba0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
2ebb0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72  write access. Wr
2ebc0 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65  ite access is re
2ebd0 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a  quired because .
2ebe0 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c        ** in excl
2ebf0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
2ec00 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
2ec10 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
2ec20 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a  pt open .      *
2ec30 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75  * and possibly u
2ec40 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
2ec50 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
2ec60 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65  Also, write-acce
2ec70 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ss .      ** is 
2ec80 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  usually required
2ec90 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2eca0 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72   journal in jour
2ecb0 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
2ecc0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20   .      ** mode 
2ecd0 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f  (and also for jo
2ece0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63  urnal_mode=trunc
2ecf0 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ate on some syst
2ed00 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ems)..      **. 
2ed10 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a       ** If the j
2ed20 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
2ed30 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
2ed40 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
2ed50 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  e .      ** othe
2ed60 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
2ed70 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
2ed80 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
2ed90 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  before .      **
2eda0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
2edb0 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
2edc0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
2edd0 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
2ede0 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
2edf0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
2ee00 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
2ee10 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
2ee20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
2ee30 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
2ee40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ee50 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
2ee60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2ee70 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2ee80 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
2ee90 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
2eea0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2eeb0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
2eec0 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b      int bExists;
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eee0 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
2eef0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
2ef00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2ef10 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
2ef20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
2ef30 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ef40 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2ef50 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73  EXISTS, &bExists
2ef60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ef70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ef80 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  bExists ){.     
2ef90 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
2efa0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
2efb0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
2efc0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2efd0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2efe0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  NAL;.          a
2eff0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2f000 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
2f010 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f020 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2f030 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2f040 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
2f050 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
2f060 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
2f070 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
2f080 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2f090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2f0a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f0b0 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  & fout&SQLITE_OP
2f0c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
2f0d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f0e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2f0f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2f100 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2f110 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
2f120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f130 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20     }.      }. . 
2f140 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
2f150 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
2f160 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
2f170 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
2f180 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
2f190 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
2f1a0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
2f1b0 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
2f1c0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
2f1d0 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
2f1e0 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
2f1f0 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
2f200 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
2f210 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
2f220 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65  cache.  Sync the
2f230 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66   hot journal bef
2f240 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20  ore playing.    
2f250 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e    ** it back sin
2f260 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ce the process t
2f270 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20  hat crashed and 
2f280 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75  left the hot jou
2f290 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72  rnal.      ** pr
2f2a0 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73  obably did not s
2f2b0 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72  ync it and we ar
2f2c0 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c  e required to al
2f2d0 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20  ways sync.      
2f2e0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ** the journal b
2f2f0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74  efore playing it
2f300 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   back..      */.
2f310 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
2f320 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2f330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f350 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
2f360 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
2f370 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
2f380 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f3a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
2f3b0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
2f3c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
2f3d0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2f3e0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20  GER_OPEN;.      
2f3f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2f400 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
2f410 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
2f420 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
2f430 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2f440 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2f450 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
2f460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f470 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2f480 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66  anch is taken if
2f490 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2f4a0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2f4b0 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
2f4c0 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   or roll back a 
2f4d0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c  hot-journal whil
2f4e0 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
2f4f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
2f500 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2f510 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  r_unlock() routi
2f520 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
2f530 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
2f540 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20  ng to unlock.   
2f550 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65       ** the file
2f560 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20  . If the unlock 
2f570 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74  attempt fails, t
2f580 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  hen Pager.eLock 
2f590 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20  must be.        
2f5a0 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  ** set to UNKNOW
2f5b0 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20  N_LOCK (see the 
2f5c0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
2f5d0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20  e #define for . 
2f5e0 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57         ** UNKNOW
2f5f0 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72  N_LOCK above for
2f600 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29   an explanation)
2f610 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
2f620 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65        ** In orde
2f630 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75  r to get pager_u
2f640 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68  nlock() to do th
2f650 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53  is, set Pager.eS
2f660 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20  tate to.        
2f670 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e  ** PAGER_ERROR n
2f680 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ow. This is not 
2f690 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64  actually counted
2f6a0 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e   as a transition
2f6b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45  .        ** to E
2f6c0 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68  RROR state in th
2f6d0 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20  e state diagram 
2f6e0 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
2f6f0 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20  is file,.       
2f700 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
2f710 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  w that the same 
2f720 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
2f730 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79  lock() will very
2f740 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72  .        ** shor
2f750 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  tly transition t
2f760 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
2f770 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74  to the OPEN stat
2f780 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20  e. Calling.     
2f790 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67     ** assert_pag
2f7a0 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64  er_state() would
2f7b0 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74   fail now, as it
2f7c0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70   should not be p
2f7d0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
2f7e0 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f  ** to be in ERRO
2f7f0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65  R state when the
2f800 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73  re are zero outs
2f810 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20  tanding page .  
2f820 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e        ** referen
2f830 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ces..        */.
2f840 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
2f850 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2f860 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
2f870 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
2f880 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2f890 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2f8a0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ER_OPEN );.     
2f8b0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
2f8c0 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
2f8d0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  LOCK).          
2f8e0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
2f8f0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
2f900 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52  ager->eLock>SHAR
2f910 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29  ED_LOCK).      )
2f920 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2f930 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2f940 6c 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61  le .     && (pPa
2f950 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20  ger->pBackup || 
2f960 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
2f970 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
2f980 50 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20  PCache)>0) .    
2f990 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2f9a0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
2f9b0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
2f9c0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2f9d0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
2f9e0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
2f9f0 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
2fa00 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
2fa10 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
2fa20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
2fa30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
2fa40 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2fa50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2fa60 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
2fa70 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
2fa80 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
2fa90 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68  hanged, flush th
2faa0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
2fab0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2fac0 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
2fad0 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64  nges is detected
2fae0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
2faf0 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
2fb00 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
2fb10 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
2fb20 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
2fb30 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
2fb40 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
2fb50 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
2fb60 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
2fb70 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
2fb80 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
2fb90 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
2fba0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
2fbb0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
2fbc0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
2fbd0 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
2fbe0 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
2fbf0 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
2fc00 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
2fc10 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
2fc20 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
2fc30 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
2fc40 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
2fc50 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
2fc60 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
2fc70 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
2fc80 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
2fc90 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
2fca0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
2fcb0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
2fcc0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
2fcd0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
2fce0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2fcf0 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  s)];..      rc =
2fd00 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2fd10 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2fd20 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2fd30 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20  goto failed;..  
2fd40 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20      if( nPage>0 
2fd50 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
2fd60 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
2fd70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
2fd80 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
2fd90 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
2fda0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
2fdb0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
2fdc0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
2fdd0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
2fde0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2fdf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2fe10 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
2fe20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fe30 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
2fe40 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
2fe50 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
2fe60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2fe70 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
2fe80 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
2fe90 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
2fea0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
2feb0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
2fec0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
2fed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2fee0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2fef0 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
2ff00 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
2ff10 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
2ff20 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
2ff30 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
2ff40 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
2ff50 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
2ff60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
2ff70 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
2ff80 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
2ff90 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65  (pPager);.#ifnde
2ffa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2ffb0 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
2ffc0 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
2ffd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ffe0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
2fff0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
30000 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
30010 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
30020 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
30030 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
30040 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
30050 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
30060 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
30070 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
30080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30090 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
300a0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
300b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
300c0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
300d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
300e0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
300f0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
30100 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
30110 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
30120 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
30130 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
30140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
30150 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
30160 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20  ER_READER;.  }. 
30170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30180 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
30190 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
301a0 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
301b0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
301c0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
301d0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
301e0 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
301f0 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
30200 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
30210 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
30220 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
30230 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
30240 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
30250 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
30260 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
30270 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
30280 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
30290 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
302a0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
302b0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
302c0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
302d0 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
302e0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
302f0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
30300 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61  e)==0) ){.    pa
30310 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
30320 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
30330 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
30340 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
30350 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
30360 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
30370 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
30380 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
30390 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
303a0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
303b0 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
303c0 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
303d0 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
303e0 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
303f0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
30400 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
30410 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
30420 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
30430 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
30440 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
30450 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
30460 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
30470 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
30480 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
30490 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
304a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
304b0 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
304c0 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
304d0 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
304e0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
304f0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
30500 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
30510 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
30520 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
30530 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
30540 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
30550 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
30560 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
30570 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
30580 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
30590 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
305a0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
305b0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
305c0 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
305d0 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
305e0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
305f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
30600 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
30610 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
30620 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
30630 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
30640 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
30650 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
30660 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
30670 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
30680 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
30690 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
306a0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
306b0 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
306c0 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
306d0 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
306e0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
306f0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
30700 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
30710 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
30720 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
30730 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
30740 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
30750 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
30760 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
30770 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
30780 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
30790 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
307a0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
307b0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
307c0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
307d0 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
307e0 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
307f0 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
30800 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
30810 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
30820 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
30830 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
30840 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
30850 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
30860 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
30870 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
30880 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
30890 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
308a0 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
308b0 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
308c0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
308d0 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
308e0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
308f0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
30900 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
30910 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
30920 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
30930 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
30940 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
30950 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
30960 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
30970 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
30980 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
30990 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
309a0 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
309b0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
309c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
309d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
309e0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
309f0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
30a00 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
30a10 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
30a20 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
30a30 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
30a40 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
30a50 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
30a60 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
30a70 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
30a80 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
30a90 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
30aa0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
30ab0 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
30ac0 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
30ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
30ae0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
30af0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
30b00 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
30b10 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
30b20 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
30b30 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
30b40 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
30b50 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
30b60 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
30b70 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
30b80 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
30b90 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
30ba0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
30bb0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
30bc0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
30bd0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
30be0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
30bf0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
30c00 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
30c10 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
30c20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
30c30 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
30c40 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
30c50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
30c60 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
30c70 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
30c80 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
30c90 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
30ca0 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
30cb0 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
30cc0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
30cd0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
30ce0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
30cf0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
30d00 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
30d10 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
30d20 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
30d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
30d40 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
30d50 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
30d60 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
30d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30d80 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
30d90 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
30da0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
30db0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
30dc0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
30dd0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
30de0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
30df0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
30e00 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
30e10 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
30e20 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
30e30 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
30e40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
30e50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
30e60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30e70 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
30e80 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
30e90 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
30ea0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
30eb0 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
30ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30ed0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30ee0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
30ef0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
30f00 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
30f10 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
30f20 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
30f30 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
30f40 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
30f50 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
30f60 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
30f70 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
30f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
30f90 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
30fa0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
30fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
30fc0 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
30fd0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
30fe0 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d   1, ppPage);.  }
30ff0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
31000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
31010 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20  Either the call 
31020 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  to sqlite3Pcache
31030 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64  Fetch() returned
31040 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65   an error or the
31050 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61  .    ** pager wa
31060 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
31070 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
31080 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
31090 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
310a0 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20  ** Set pPg to 0 
310b0 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  and jump to the 
310c0 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65  exception handle
310d0 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  r.  */.    pPg =
310e0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   0;.    goto pag
310f0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
31100 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
31110 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
31120 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
31130 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
31140 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a  er==pPager || (*
31150 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
31160 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70  =0 );..  if( (*p
31170 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26  pPage)->pPager &
31180 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  & !noContent ){.
31190 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
311a0 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
311b0 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
311c0 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
311d0 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
311e0 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
311f0 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
31200 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  do.  */.    asse
31210 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f  rt( pgno<=PAGER_
31220 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f  MAX_PGNO && pgno
31230 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
31240 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
31250 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20  Pager->nHit++;. 
31260 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31270 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
31280 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
31290 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
312a0 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
312b0 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
312c0 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
312d0 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a  itialized.  */..
312e0 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
312f0 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  e;.    pPg->pPag
31300 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
31310 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
31320 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
31330 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
31340 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
31350 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
31360 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
31370 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
31380 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
31390 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
313a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
313b0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
313c0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
313d0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
313e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
313f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31400 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
31410 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
31420 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
31430 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
31440 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e  dbSize<pgno || n
31450 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
31460 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
31470 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
31480 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
31490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
314a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
314b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
314c0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
314d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
314e0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
314f0 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
31500 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
31510 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
31520 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
31530 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
31540 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
31550 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
31560 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
31570 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
31580 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
31590 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
315a0 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
315b0 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
315c0 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
315d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
315e0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
315f0 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
31600 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
31610 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
31620 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
31630 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
31640 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31650 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
31660 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
31670 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
31680 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
31690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
316a0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
316b0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
316c0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
316d0 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
316e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
316f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
31700 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
31710 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
31720 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
31730 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
31740 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
31750 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
31760 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
31770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31780 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
31790 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
317a0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
317b0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
317c0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
317d0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
317e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
317f0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
31800 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
31810 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
31820 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70  Pager );.      p
31830 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a  Pager->nMiss++;.
31840 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
31850 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
31860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
31880 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
31890 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
318a0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
318b0 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
318c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
318d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
318e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
318f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
31900 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
31910 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
31920 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
31930 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
31940 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
31950 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65  ger);..  *ppPage
31960 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
31970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
31980 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
31990 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
319a0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
319b0 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
319c0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
319d0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
319e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
319f0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
31a00 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
31a10 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
31a20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
31a30 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
31a40 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
31a50 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
31a60 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
31a70 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
31a80 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
31a90 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
31aa0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
31ab0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
31ac0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
31ad0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
31ae0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
31af0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
31b00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
31b10 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
31b20 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
31b30 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
31b40 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
31b50 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
31b60 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
31b70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
31b80 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
31b90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31ba0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
31bb0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
31bc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
31bd0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73  Cache!=0 );.  as
31be0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31bf0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
31c00 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
31c10 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
31c20 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  R );.  sqlite3Pc
31c30 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
31c40 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
31c50 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74   0, &pPg);.  ret
31c60 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
31c70 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
31c80 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
31c90 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
31ca0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
31cb0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
31cc0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
31cd0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
31ce0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
31cf0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
31d00 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
31d10 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
31d20 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
31d30 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
31d40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
31d50 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
31d60 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
31d70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
31d80 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
31d90 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
31da0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
31db0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
31dc0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
31dd0 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
31de0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
31df0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
31e00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
31e10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
31e20 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
31e30 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
31e40 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
31e50 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
31e60 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
31e70 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
31e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
31e90 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
31ea0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
31eb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
31ec0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31ed0 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
31ee0 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
31ef0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
31f00 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
31f10 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
31f20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
31f30 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
31f40 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
31f50 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
31f60 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
31f70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
31f80 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
31f90 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
31fa0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
31fb0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
31fc0 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
31fd0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
31fe0 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
31ff0 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
32000 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
32010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32020 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
32030 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
32040 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
32050 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
32060 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
32070 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
32080 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
32090 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
320a0 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
320b0 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
320c0 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
320d0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
320e0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
320f0 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
32100 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
32110 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
32120 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
32130 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
32140 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
32150 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
32160 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
32170 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
32180 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
32190 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
321a0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
321b0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
321c0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
321d0 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
321e0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
321f0 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
32200 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
32210 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
32220 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
32230 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
32260 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
32270 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
32280 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
32290 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
322a0 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
322b0 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
322c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
322d0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
322e0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
322f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
32300 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
32310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
32320 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
32330 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
32340 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
32350 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
32360 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
32370 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
32380 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
32390 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
323a0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
323b0 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
323c0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
323d0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
323e0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
323f0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
32400 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
32410 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
32420 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
32430 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
32440 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
32450 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
32460 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
32470 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
32480 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
32490 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
324a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
324b0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
324c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
324d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
324e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
324f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32500 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
32510 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
32520 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
32530 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32540 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
32550 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
32560 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32570 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
32580 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
32590 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
325a0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
325b0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
325c0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325e0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
325f0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
32600 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
32610 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
32620 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
32630 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
32640 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
32650 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
32660 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
32670 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
32680 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
32690 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
326a0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
326b0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
326c0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
326d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
326e0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
326f0 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  E.        rc = s
32700 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
32710 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  n(.            p
32720 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
32730 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
32740 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
32750 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
32760 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23  ).        );.  #
32770 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
32780 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32790 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
327a0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
327b0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
327c0 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d    #endif.      }
327d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
327e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
327f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32800 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
32810 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
32820 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
32830 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
32840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
32850 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
32860 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
32870 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
32880 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
32890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
328a0 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
328b0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
328c0 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
328d0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
328e0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
328f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
32900 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
32910 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
32920 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
32930 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32940 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
32950 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
32960 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
32970 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
32980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32990 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
329a0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
329b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
329c0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
329d0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
329e0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
329f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32a00 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
32a10 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
32a20 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
32a30 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
32a40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
32a50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
32a60 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
32a70 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
32a80 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
32a90 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
32aa0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
32ab0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
32ac0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
32ad0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
32ae0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
32af0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
32b00 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
32b10 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
32b20 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
32b30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32b40 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
32b50 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
32b60 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
32b70 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
32b80 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
32b90 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
32ba0 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
32bb0 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
32bc0 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
32bd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
32be0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
32bf0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
32c00 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
32c10 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
32c20 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
32c30 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
32c40 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
32c50 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
32c60 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
32c70 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
32c80 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
32c90 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
32ca0 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
32cb0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
32cc0 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
32cd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
32ce0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
32cf0 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
32d00 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
32d10 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
32d20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
32d30 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
32d40 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
32d50 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
32d60 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
32d70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
32d80 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
32d90 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
32da0 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
32db0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
32dc0 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
32dd0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
32de0 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
32df0 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
32e00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
32e10 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
32e20 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61  ode ) return pPa
32e30 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
32e40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32e50 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
32e60 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
32e70 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52  eState<PAGER_ERR
32e80 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OR );.  pPager->
32e90 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
32ea0 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
32eb0 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
32ec0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32ed0 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a  AGER_READER) ){.
32ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32ef0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
32f00 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  0 );..    if( pa
32f10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32f20 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
32f30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
32f40 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
32f50 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
32f60 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
32f70 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
32f80 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
32f90 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
32fa0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
32fb0 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
32fc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
32fd0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32fe0 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
32ff0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
33000 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
33010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33020 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
33030 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
33040 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
33050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
33070 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
33080 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
33090 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
330a0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
330b0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
330c0 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
330d0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
330e0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
330f0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
33100 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
33110 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
33120 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
33130 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
33140 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
33150 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
33160 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
33170 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
33180 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
33190 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
331a0 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
331b0 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
331c0 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
331d0 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
331e0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
331f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
33200 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
33210 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
33220 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
33230 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
33240 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
33250 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33260 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
33270 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
33280 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
33290 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
332a0 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
332b0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
332c0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
332d0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
332e0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
332f0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
33300 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
33310 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
33320 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
33330 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
33340 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
33350 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
33360 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
33370 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
33380 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
33390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
333a0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
333b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
333c0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
333d0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
333e0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
333f0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
33400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33410 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
33420 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
33430 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
33440 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
33450 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
33460 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
33470 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
33480 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
33490 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
334a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
334b0 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
334c0 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
334d0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
334e0 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
334f0 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
33500 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
33510 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
33520 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
33530 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
33540 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
33550 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
33560 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
33570 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
33580 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
33590 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
335a0 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
335b0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
335c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
335d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
335e0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
335f0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
33600 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
33610 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
33620 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
33630 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
33640 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
33650 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
33660 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
33670 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
33680 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
33690 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
336a0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
336b0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
336c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
336d0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
336e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
336f0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
33700 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33710 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
33720 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
33730 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
33740 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
33750 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
33760 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
33770 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
33780 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33790 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
337a0 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
337b0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
337c0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
337d0 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
337e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
337f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
33800 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
33810 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
33820 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
33830 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
33840 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
33850 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
33860 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
33870 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
33880 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
33890 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
338a0 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
338b0 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
338c0 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
338d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
338e0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
338f0 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
33900 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
33910 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
33920 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
33930 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
33940 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
33950 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
33960 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
33970 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
33980 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
33990 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
339a0 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
339b0 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
339c0 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
339d0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
339e0 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
339f0 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
33a00 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
33a10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33a20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33a30 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
33a40 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
33a50 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
33a60 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
33a70 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
33a80 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
33a90 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
33aa0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33ab0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33ac0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
33ad0 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
33ae0 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
33af0 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65  cted, report the
33b00 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a   same error.  **
33b10 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f   again. This sho
33b20 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20  uld not happen, 
33b30 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72  but the check pr
33b40 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73  ovides robustnes
33b50 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
33b60 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
33b70 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
33b80 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
33b90 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
33ba0 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
33bb0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
33bc0 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
33bd0 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
33be0 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
33bf0 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
33c00 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
33c10 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
33c20 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
33c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
33c40 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
33c50 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  E(pPg);..  /* Th
33c60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
33c70 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65  eeds to be opene
33c80 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20  d. Higher level 
33c90 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c  routines have al
33ca0 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69  ready.  ** obtai
33cb0 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ned the necessar
33cc0 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e  y locks to begin
33cd0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
33ce0 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a  action, but the.
33cf0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
33d00 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
33d10 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65  yet be open. Ope
33d20 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73  n it now if this
33d30 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
33d40 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
33d50 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  done before call
33d60 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
33d70 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20  eMakeDirty() on 
33d80 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20  the page. .  ** 
33d90 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74  Otherwise, if it
33da0 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72   were done after
33db0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
33dc0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
33dd0 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20  ), then.  ** an 
33de0 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75  error might occu
33df0 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  r and the pager 
33e00 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20  would end up in 
33e10 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
33e20 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61  ate.  ** with pa
33e30 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69  ges marked as di
33e40 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  rty in the cache
33e50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
33e60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33e70 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
33e80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
33e90 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
33ea0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
33eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
33ed0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33ee0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
33ef0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
33f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
33f10 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33f20 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
33f30 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
33f40 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
33f50 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
33f60 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
33f70 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
33f80 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
33f90 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
33fa0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
33fb0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
33fc0 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
33fd0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
33fe0 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
33ff0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
34000 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
34010 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
34020 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
34030 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
34040 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
34050 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
34060 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
34070 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
34080 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
34090 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
340a0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
340b0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
340c0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
340d0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
340e0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
340f0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
34100 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
34110 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
34120 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
34130 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
34140 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
34150 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
34160 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
34170 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
34180 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
34190 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
341a0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
341b0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
341c0 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
341d0 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
341e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
341f0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
34200 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
34210 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
34220 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
34230 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
34240 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
34250 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
34260 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
34270 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
34280 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
34290 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
342a0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
342b0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
342c0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
342d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
342e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
342f0 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
34300 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
34310 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
34320 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
34330 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
34340 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
34350 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
34360 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
34370 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
34380 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ta2);..        /
34390 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
343a0 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
343b0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
343c0 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
343d0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
343e0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
343f0 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
34400 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
34410 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
34420 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
34430 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
34440 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
34450 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
34460 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
34470 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
34480 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
34490 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
344a0 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
344b0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
344c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
344d0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
344e0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
344f0 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
34500 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
34510 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
34520 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34530 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
34540 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
34550 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ..        rc = w
34560 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
34570 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
34580 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
34590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
345a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
345b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
345c0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
345d0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
345e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
345f0 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20  ze, iOff+4);.   
34600 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34610 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
34620 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
34630 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
34640 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
34650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
34660 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  4, cksum);.     
34670 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34680 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34690 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ;..        IOTRA
346a0 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
346b0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
346c0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
346d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
346f0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
34700 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
34710 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
34720 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
34730 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
34740 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
34750 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
34760 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
34770 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
34780 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
34790 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
347a0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
347b0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
347c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
347d0 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
347e0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
347f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
34800 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
34810 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34820 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
34830 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
34840 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34850 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
34860 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
34870 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
34880 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
34890 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
348a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
348b0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
348c0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
348d0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
348e0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
348f0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34900 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
34910 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34920 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
34930 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
34940 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34950 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
34960 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
34970 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
34990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
349a0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
349b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
349c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
349d0 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OD ){.          
349e0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
349f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
34a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34a10 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
34a20 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
34a30 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
34a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
34a60 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
34a70 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
34a80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
34a90 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
34aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34ab0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
34ac0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
34ad0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
34ae0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
34af0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
34b00 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
34b10 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
34b20 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
34b30 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
34b40 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
34b50 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
34b60 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
34b70 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
34b80 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
34b90 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
34ba0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
34bb0 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
34bc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
34bd0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
34be0 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
34bf0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
34c00 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
34c10 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
34c20 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
34c30 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
34c40 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
34c50 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
34c60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
34c70 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
34c80 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
34c90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
34ca0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
34cb0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
34cc0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
34cd0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
34ce0 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
34cf0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
34d00 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
34d10 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
34d20 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
34d30 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
34d40 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
34d50 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
34d60 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
34d70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
34d80 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
34d90 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
34da0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
34db0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
34dc0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
34dd0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
34de0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
34df0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
34e00 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
34e10 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
34e20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
34e30 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
34e40 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
34e50 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
34e60 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
34e70 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
34e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
34e90 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
34ea0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
34eb0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
34ec0 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
34ed0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
34ee0 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
34ef0 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
34f00 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
34f10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
34f20 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
34f30 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
34f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34f50 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
34f60 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
34f70 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
34f80 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
34f90 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
34fa0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
34fb0 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
34fc0 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72  eSize);..  asser
34fd0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
34fe0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
34ff0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
35000 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35010 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
35020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35030 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35040 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
35050 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
35060 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
35070 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
35080 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
35090 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
350a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
350b0 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
350d0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
350e0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
350f0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
35100 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
35110 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
35120 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
35130 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
35140 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
35150 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
35160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35170 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
35180 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
35190 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
351a0 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
351b0 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
351c0 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
351d0 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
351e0 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f  yncSpill flag to
351f0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
35200 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
35210 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75  low.    ** a jou
35220 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62  rnal header to b
35230 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
35240 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
35250 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  naled by.    ** 
35260 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
35270 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
35280 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
35290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
352a0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
352b0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
352c0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b  >doNotSyncSpill+
352d0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  +;..    /* This 
352e0 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
352f0 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
35300 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
35310 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
35320 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
35330 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
35340 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
35350 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
35360 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
35370 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
35380 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
35390 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
353a0 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
353b0 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
353c0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
353d0 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
353e0 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64  ount = pPager->d
353f0 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70  bSize;.    if( p
35400 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
35410 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
35420 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
35430 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
35440 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
35450 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
35460 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
35470 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
35480 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
35490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
354a0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
354b0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
354c0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
354d0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
354e0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
354f0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
35500 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
35510 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
35520 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
35530 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
35540 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
35550 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
35560 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
35570 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
35580 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
35590 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
355a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
355b0 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
355c0 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
355d0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
355e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
355f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
35600 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
35610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
35620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35630 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
35640 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
35650 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35660 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
35670 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
35680 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
35690 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
356a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
356b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
356c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
356d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
356e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
356f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
35700 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
35710 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
35720 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
35730 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
35740 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
35750 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
35760 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
35770 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
35780 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35790 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
357a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
357b0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
357c0 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
357d0 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
357e0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
357f0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
35800 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
35810 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
35820 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
35830 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
35840 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
35850 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
35860 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
35870 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
35880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
35890 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
358a0 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
358b0 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
358c0 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
358d0 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
358e0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
358f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
35900 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
35910 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
35920 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
35930 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
35940 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
35950 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29   ii<nPage; ii++)
35960 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
35970 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
35980 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
35990 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
359a0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
359b0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61        pPage->fla
359c0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
359d0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
359e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
359f0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
35a00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35a10 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
35a20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
35a30 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  cSpill==1 );.   
35a40 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
35a50 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c  ncSpill--;.  }el
35a60 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
35a70 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
35a80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35a90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
35aa0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
35ab0 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
35ac0 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
35ad0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
35ae0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
35af0 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
35b00 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
35b10 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
35b20 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
35b30 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
35b40 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
35b50 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
35b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
35b70 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
35b80 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
35b90 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
35ba0 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
35bb0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
35bc0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
35bd0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
35be0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
35bf0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
35c00 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
35c10 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
35c20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
35c30 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
35c40 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
35c50 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
35c60 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65  rty.  This happe
35c70 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
35c80 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67   when.** the pag
35c90 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64  e has been added
35ca0 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68   as a leaf of th
35cb0 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73  e freelist and s
35cc0 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o its.** content
35cd0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65   no longer matte
35ce0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  rs..**.** The ov
35cf0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
35d00 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
35d10 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
35d20 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
35d30 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
35d40 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54  age is unused. T
35d50 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
35d60 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
35d70 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
35d80 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
35d90 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
35da0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
35db0 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
35dc0 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70  tion can quadrup
35dd0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
35de0 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45  large .** DELETE
35df0 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
35e00 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
35e10 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72  rDontWrite(PgHdr
35e20 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
35e30 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
35e40 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50  Pager;.  if( (pP
35e50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
35e60 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d  IRTY) && pPager-
35e70 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  >nSavepoint==0 )
35e80 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
35e90 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  (("DONT_WRITE pa
35ea0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
35eb0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
35ec0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
35ed0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
35ee0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
35ef0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
35f00 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
35f10 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  = PGHDR_DONT_WRI
35f20 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  TE;.    pager_se
35f30 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
35f40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
35f50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
35f60 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
35f70 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
35f80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35f90 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
35fa0 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
35fb0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
35fc0 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
35fd0 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
35fe0 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
35ff0 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68   pager file.  Th
36000 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e  e secondary chan
36010 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a  ge counter at.**
36020 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61   92 is also upda
36030 74 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53  ted, as is the S
36040 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
36050 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
36060 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69  6..**.** But thi
36070 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
36080 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  f the pPager->ch
36090 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
360a0 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20  ag is false..** 
360b0 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20  To avoid excess 
360c0 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65  churning of page
360d0 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f   1, the update o
360e0 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65  nly happens once
360f0 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68  ..** See also th
36100 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  e pager_write_ch
36110 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f  angecounter() ro
36120 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
36130 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69  an .** unconditi
36140 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74  onal update of t
36150 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
36160 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
36170 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
36180 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
36190 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
361a0 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
361b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
361c0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
361d0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
361e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
361f0 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
36200 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
36210 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
36220 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
36230 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
36240 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
36250 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
36260 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
36270 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
36280 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
36290 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
362a0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
362b0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
362c0 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
362d0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
362e0 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
362f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
36300 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
36310 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
36320 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
36330 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
36340 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
36350 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
36360 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
36370 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
36380 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
36390 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
363a0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
363b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
363c0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
363d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
363e0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
363f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36400 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
36410 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
36420 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36430 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
36440 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
36450 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36460 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36470 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
36480 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
36490 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
364a0 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
364b0 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
364c0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
364d0 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
364e0 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
364f0 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
36500 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
36510 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
36520 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
36530 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
36540 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
36550 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
36560 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
36570 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
36580 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
36590 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
365a0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
365b0 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
365c0 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
365d0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
365e0 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
365f0 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
36600 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
36610 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
36620 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
36630 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
36640 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
36650 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
36660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36670 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
36680 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52  ITE.# define DIR
36690 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73  ECT_MODE 0.  ass
366a0 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
366b0 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
366c0 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
366d0 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
366e0 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
366f0 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64  MODE isDirectMod
36700 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
36710 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
36720 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
36730 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
36740 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
36750 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
36760 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
36770 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20  o page 1 */..   
36780 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
36790 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
367a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
367b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
367c0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
367d0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
367e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
367f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
36800 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
36810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
36820 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
36830 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
36840 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
36850 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
36860 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
36870 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
36880 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
36890 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
368a0 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
368b0 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
368c0 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
368d0 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
368e0 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
368f0 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
36900 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
36910 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
36920 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
36930 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
36940 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
36950 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
36960 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
36970 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
36980 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
36990 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
369a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
369b0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
369c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
369d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
369e0 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20 74 68  * Actually do th
369f0 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
36a00 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a  change counter *
36a10 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 77 72  /.      pager_wr
36a20 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
36a30 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20 20 20  r(pPgHdr);..    
36a40 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
36a50 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
36a60 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
36a70 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
36a80 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
36a90 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f     if( DIRECT_MO
36aa0 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DE ){.        co
36ab0 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a  nst void *zBuf;.
36ac0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36ad0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
36ae0 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
36af0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
36b00 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c  PgHdr->pData, 1,
36b10 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   6, rc=SQLITE_NO
36b20 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  MEM, zBuf);.    
36b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36b50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
36b60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
36b70 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
36b80 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
36b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36ba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36bb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36bc0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
36bd0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
36be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
36bf0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
36c00 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
36c10 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
36c20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
36c30 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
36c40 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
36c50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36c60 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
36c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36c80 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
36c90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
36ca0 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61   disk. This is a
36cb0 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65   no-op for in-me
36cc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 0a 2a  mory databases.*
36cd0 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20  * or pages with 
36ce0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
36cf0 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
36d00 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
36d10 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f 6e 20  or if called on 
36d20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
36d30 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
36d40 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
36d50 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
36d60 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
36d70 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
36d80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
36d90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36da0 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
36db0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
36dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
36dd0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
36de0 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
36df0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72   !MEMDB );.    r
36e00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
36e10 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
36e20 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
36e30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
36e40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
36e50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
36e60 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 73 71  !MEMDB );.    sq
36e70 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
36e80 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
36e90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
36ea0 5f 4f 4d 49 54 54 45 44 2c 20 28 76 6f 69 64 20  _OMITTED, (void 
36eb0 2a 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  *)&rc);.  }.  re
36ec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36ed0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
36ee0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
36ef0 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74 65  ed while a write
36f00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
36f10 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c  active in.** rol
36f20 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f  lback. If the co
36f30 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57  nnection is in W
36f40 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  AL mode, this ca
36f50 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a  ll is a no-op. .
36f60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
36f70 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
36f80 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
36f90 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49   have an EXCLUSI
36fa0 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  VE lock on .** t
36fb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36fc0 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  , an attempt is 
36fd0 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f  made to obtain o
36fe0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
36ff0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
37000 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
37010 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  or the attempt t
37020 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a  o obtain it is.*
37030 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  * successful, or
37040 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
37050 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  is in WAL mode, 
37060 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
37070 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  urned..** Otherw
37080 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49  ise, either SQLI
37090 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51  TE_BUSY or an SQ
370a0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
370b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
370c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
370d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  t sqlite3PagerEx
370e0 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65  clusiveLock(Page
370f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
37100 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37120 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37130 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37140 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  D .       || pPa
37150 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37160 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
37170 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
37180 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37190 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a  _WRITER_LOCKED .
371a0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
371b0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
371c0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69  e(pPager) );.  i
371d0 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61  f( 0==pagerUseWa
371e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
371f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
37200 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
37210 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
37220 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37230 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
37240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37250 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
37260 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
37270 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
37280 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
37290 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
372a0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
372b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
372c0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
372d0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
372e0 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
372f0 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
37300 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
37310 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
37320 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
37330 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
37340 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
37350 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
37360 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
37370 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
37380 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
37390 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
373a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
373b0 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
373c0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
373d0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
373e0 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
373f0 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
37400 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
37410 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
37420 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
37430 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
37440 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
37450 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
37460 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37470 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
37480 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
37490 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
374a0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
374b0 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
374c0 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
374d0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
374e0 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
374f0 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
37500 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
37510 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
37520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
37530 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
37540 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
37550 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
37560 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
37570 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
37580 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
37590 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
375a0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
375b0 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
375c0 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
375d0 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
375e0 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
375f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37600 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
37610 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
37620 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
37630 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
37640 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
37650 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
37660 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
37670 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
37680 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
37690 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
376a0 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
376b0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
376c0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
376d0 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
376e0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
376f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
37700 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
37710 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
37720 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
37730 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
37740 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
37750 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
37760 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
37770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
37780 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
37790 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
377a0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
377b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
377d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
377e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
377f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37800 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
37810 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37820 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37830 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
37840 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37850 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37860 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20  ITER_DBMOD.     
37870 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37880 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
37890 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
378a0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
378b0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
378c0 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65   /* If a prior e
378d0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72  rror occurred, r
378e0 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72  eport that error
378f0 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28   again. */.  if(
37900 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
37910 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
37920 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
37930 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
37940 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
37950 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
37960 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c  =%s nSize=%d\n",
37970 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
37980 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
37990 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
379a0 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  ze));..  /* If n
379b0 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  o database chang
379c0 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  es have been mad
379d0 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  e, return early.
379e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
379f0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
37a00 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
37a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37a20 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  K;..  if( MEMDB 
37a30 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
37a40 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
37a50 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
37a60 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
37a70 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
37a80 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
37a90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
37aa0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d   called, it is m
37ab0 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20  ostly a no-op.  
37ac0 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20  However, any.   
37ad0 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72   ** backup in pr
37ae0 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20  ogress needs to 
37af0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
37b00 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
37b10 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
37b20 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
37b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
37b40 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
37b50 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67  ger) ){.      Pg
37b60 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
37b70 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
37b80 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
37b90 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48 64  che);.      PgHd
37ba0 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30 3b  r *pPageOne = 0;
37bb0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
37bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
37bd0 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74 20 6c  * Must have at l
37be0 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66 6f  east one page fo
37bf0 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69 74  r the WAL commit
37c00 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20 2a   flag..        *
37c10 2a 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35 63  * Ticket [2d1a5c
37c20 36 37 64 66 63 32 33 36 33 65 34 34 66 32 39 64  67dfc2363e44f29d
37c30 39 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30 35  9bbd57f] 2011-05
37c40 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  -18 */.        r
37c50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37c60 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
37c70 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20  pPageOne);.     
37c80 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67 65     pList = pPage
37c90 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  One;.        pLi
37ca0 73 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  st->pDirty = 0;.
37cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
37cc0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37cd0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
37ce0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
37cf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
37d00 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
37d10 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61  ager, pList, pPa
37d20 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20  ger->dbSize, 1, 
37d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
37d40 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f  ager->fullSync ?
37d50 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
37d60 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  gs : 0).        
37d70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37d90 65 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20  ef(pPageOne);.  
37da0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37db0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37dc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
37dd0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
37de0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d  PCache);.      }
37df0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37e00 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
37e10 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
37e20 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
37e30 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
37e40 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
37e50 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
37e60 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
37e70 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
37e80 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
37e90 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
37ea0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
37eb0 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
37ec0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
37ed0 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
37ee0 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
37ef0 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
37f00 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
37f10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
37f20 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
37f30 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
37f40 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
37f50 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
37f60 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
37f70 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
37f80 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
37f90 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
37fa0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
37fb0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
37fc0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
37fd0 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
37fe0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
37ff0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
38000 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
38010 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
38020 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
38030 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
38040 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
38050 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
38060 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
38070 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
38080 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
38090 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
380a0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
380b0 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
380c0 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
380d0 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
380e0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
380f0 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
38100 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
38110 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
38120 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
38130 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
38140 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
38150 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
38160 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
38170 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
38180 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
38190 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
381a0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
381b0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
381c0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
381d0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
381e0 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
381f0 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
38200 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
38210 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
38220 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
38230 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
38240 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
38250 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
38260 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
38270 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
38280 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
38290 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
382a0 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
382b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
382c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
382d0 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
382e0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
382f0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
38300 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
38310 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
38320 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
38330 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
38340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
38350 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
38360 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
38370 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
38380 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
38390 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
383a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
383b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
383c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
383d0 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
383e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
383f0 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70  ster && isOpen(p
38400 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
38410 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
38420 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
38430 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
38440 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  ) .       && pPa
38450 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
38460 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a  ger->dbOrigSize.
38470 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70         && (0==(p
38480 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
38490 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
384a0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c  er->pPCache)) ||
384b0 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29   0==pPg->pDirty)
384c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
384d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
384e0 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
384f0 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64  ounter via the d
38500 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68  irect-write meth
38510 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  od. The .       
38520 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61   ** following ca
38530 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74  ll will modify t
38540 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
38550 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
38560 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a  age 1 .        *
38570 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  * to include the
38580 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20   updated change 
38590 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
385a0 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20   write page 1 . 
385b0 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74         ** direct
385c0 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
385d0 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65  se file. Because
385e0 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   of the atomic-w
385f0 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  rite .        **
38600 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
38610 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
38620 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
38630 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
38640 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
38650 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
38660 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
38670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
38690 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
386a0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
386b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
386c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
386d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
386e0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(